【问题标题】:JavaScript: Implicit conversions of non boolean values in expressionsJavaScript:表达式中非布尔值的隐式转换
【发布时间】:2018-08-04 00:07:01
【问题描述】:

我的问题与三个链接有关(下面三个链接中的代码截图和解释):

List of values which, when converted to boolean, are evaluated as false

First and Second code boxes (see below)

Third code box and explanation (see below)

我的问题有几个部分:

  1. (第一个代码框)var boo 如何以及为什么等于'world' 而不是'hello'?根据第一张图片,这两个值都应该被评估为true,那么为什么它们中的任何一个都等于boo

  2. (第二个代码框) 这比前一个更有意义。但是,为什么等式的结果默认为等式的true 部分而不是false

  3. (第 3 个代码框) 现在这非常令人困惑。我试图理解代码框下方的解释,但我无法弄清楚其中的原因。通过解释:

    一个。第一行中的myNumber = false:这部分是有道理的,因为值"1",由于逻辑运算符!,被转换为布尔值,这使得它改为:true。因此,!1 在布尔值中的意思是:!true(不正确),这是错误的。

    b. myNumber !=== null,因为它等于 false。这就是令人困惑的地方。 null 不能等于 false 的唯一方法是,如果 null 不是此特定代码行中的值(请参阅第一个链接,它在评估为 false 的值列表中列出了 null)。在解释中,它说 “在 if 语句中,在第 3 行,false 不等于 null。” 这似乎是自相矛盾的。

    c。 myNumber === false,因此它的值是2。在这里,它再次给变量​​true 值,而不是仅仅说变量是false (“再次”是对链接#2 - 2nd code box 的引用)这是为什么??

提前感谢您的帮助!

贝塞米克

【问题讨论】:

  • 请勿发布代码图片。编辑您的问题并添加代码本身。
  • 谷歌“javascript truthy”了解被认为是真实和虚假的内容,然后谷歌“javascript Triple equal”了解===== 的工作原理
  • 感谢李泰勒的信息!这是我的第一个问题,所以下次我会记住这一点。

标签: javascript boolean expression implicit-conversion


【解决方案1】:

您需要了解&&|| 运算符的作用。它们被称为布尔运算符,因为它们对输入的布尔值进行操作,但不会修改实际值,因为 Javascript 是动态类型的。这一点很重要,因为返回原始输入值比返回布尔值更好,因为它们都将计算为相同的布尔值,但如果运算符将输入转换为布尔输出,您将丢失信息。

1) var boo = 'hello' && 'world'

&&(and) 运算符的逻辑是对第一个输入求值,如果求值为false,则返回,否则返回第二个值。就是这样,这就是合同。

在这种情况下,由于'hello' 为真,它立即返回'world'

2)var boo2 = (0/0) || 43.2

|| (or) 运算符的逻辑与 && (and) 运算符相反,它计算第一个输入,如果该输入为 true,则返回它,否则返回第二个值。

如您所见,(0/0) 的计算结果为 false,因此它立即返回第二个值。

3)

1| var myNumber = !1;
2| 
3| if (myNumber == null) {
4|   myNumber = 3
5| }
6|
7| myNumber = myNumber || 2

这里的问题再次在于理解运算符的作用,== 相等运算符不是布尔运算符,因此在进行比较之前它不会将输入评估为布尔值。所以在第 3 行,您实际上是在询问布尔值 false 是否等于 null 对象。在这种情况下,它不是。

最后,对于myNumber = myNumber || 2 行,只需参考我上面关于||(或)运算符所做的评论,它就会有意义。

注意:如果您希望将这些表达式计算为布尔值,您可以使用以下语法将它们转换为布尔值:

var boo = !!('hello' && 'world');

“!”否定表达式并将其转换为布尔值,再次否定它会给出正确的值。

【讨论】:

  • 谢谢!这非常有帮助!我想我终于明白了!
  • 很高兴为您提供帮助!随意接受答案和/或投票,以便其他人可以找到它!
【解决方案2】:
  1. 变量boo 计算结果为'world' 而不是'hello' 的原因是&& 运算符。该运算符基本上是说如果第一个值的计算结果为true,则取第二个值

  2. 基本上与&& 运算符相反,|| 运算符如果第一个值的计算结果为false,则采用第二个值

  3. falsenull 在测试相等性时仍然是不同的值。即使它们在布尔测试中都被评估为false,但这些值是不同的,并且相等性检查失败。测试相等性不同于测试truefalse。您解释的c 部分可以追溯到第二个问题的答案,其中|| 运算符采用第二个值,因为第一个值已评估为false

我希望这些可以帮助您解决问题。

【讨论】:

    【解决方案3】:

    这是因为第一张图片是错误的。

    null 不能比较为真或假,只能隐式比较为等于 undefined

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/null

    继续

    let foo = A && B
    
    // the above is the same to the one below
    function fooFunction(a, b){
       if(!a)
         return a
       else
         return b
    }
    

    foo 将是 A 的值 如果 A 可以强制为 false;否则,它将是 B 并且类型无关紧要。

    let fooA = '' && 'abc' //''
    let fooB = 'something' && 'abc' //'abc'
    

    fooA 将是 '',因为第一个值被强制为 false,而 fooB 会注意到第一个值无法强制为 false,然后将为其分配第二个值,即“abc”

    ||相同

    let foo = A || B
    

    foo 将是 A 的值 如果 A 可以强制为 true;否则,它将是 B 并且类型无关紧要。

    第三张图现在应该更容易理解了

    【讨论】:

      【解决方案4】:

      好问题!

      我的答案

      1. Logical AND (&&) 可用于Short-circuit evaluation,这是由left to right 完成的。此逻辑运算符返回 second 真实值(如果存在)。如果不只是返回 false。

        - true && (anything) 短路评估为 true 但返回任何内容。

        - false && (anything) 短路评估为 false 并返回 false。

      2. Logical OR (||) 也可用于Short-circuit evaluation,如left to right 所述。此逻辑运算符返回 first 真实值。

        - var foo = '猫' || '狗' // =>>>>> foo = "猫"

        - var foo2 = '猫' || false ' // =>>>> foo2 = "猫"

        - var foo3 = '' ||假 // =>>>> foo3 = 假

        var boo2 = (0/0) || 的原因43.2 return 43.2 是因为 (0/0) 被评估为 NaN 并且在这种情况下第一个真值将是 43.2。

      3. 在第一行中,myNumber 不是 true,换句话说就是 false。在第三行中,将 myNumber 的当前值与 null 进行比较。然后因为 null 不为 false 且类型不相等,不执行 if 语句,代码一直持续到第 7 行。在第 7 行发生了答案 2 中解释的情况。

      var boo = !1
      console.log('var boo with value ', boo + ' is a ', typeof(boo))
      console.log('Null is an ', typeof(null), ' but false is a ', typeof(!true))
      
      console.log(typeof(false || true) == typeof(null)) // types are not equal
      console.log(!true == null) // so they are not equal

      逻辑规则保证这些评估总是正确的。请注意,上述表达式的任何部分都不会被评估,因此这样做的任何副作用都不会生效。另外,请注意,上述表达式的任何部分都是任何单个逻辑表达式(如括号所示)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-17
        • 1970-01-01
        • 1970-01-01
        • 2017-04-11
        • 2013-10-03
        相关资源
        最近更新 更多