【问题标题】:JS 0 === (0 || 6); returns false - why?JS 0 === (0 || 6);返回 false - 为什么?
【发布时间】:2018-08-20 00:04:37
【问题描述】:
0 === (0 || 6) // returns false
false === (false || 6) // returns false
(false === false || false === 6) // returns true
(0 === 0 || 0 === 6) // returns true

console.log( 0 === (0 || 6) );
console.log( false === (false || 6) );
console.log( (false === false || false === 6) );
console.log( (0 === 0 || 0 === 6) );

什么给了?我之前遇到过这种情况,但不明白。

【问题讨论】:

  • "(0 === 0 || 0 === 6) 返回 true"。你到底期待什么?
  • (0 || 6) 计算结果为 6。因此,0 === 6 当然会返回false

标签: javascript conditional equality conditional-operator


【解决方案1】:
0 === (0 || 6) // returns false

这都是关于操作顺序的。这将返回 false,因为首先评估括号。所以(0 || 6) 返回 6 而0 === 6false

false === (false || 6) // returns false

(false === false || false === 6) // returns true

(0 === 0 || 0 === 6) // returns true

解释完之后就很容易理解了。

【讨论】:

  • 如果你真的很困惑,为了额外的澄清,(0 || 6) === 6 因为 0 是假的。所以 (0 || 6) 在这种情况下在逻辑上等价于 (false || true)。
  • @lukeic 也许我没有听从你的解释,但(0 || 6) 不等于(false || true)。第一个返回6,第二个返回true6 !== true.
  • @TylerRoper 类型方面是的,6 是一个数字,true 是一个布尔值,因此 6 !== true。然而,我的意思是,当将(0 || 6) 视为一个逻辑语句时——即如果 0 为真,那么该语句为真。或者如果 6 为真,则该语句为真 - 将其视为语句 (false || true) 可能会有所帮助,因为 0 被认为是假的,而 6 则不是。
【解决方案2】:

0 === (0 || 6) 等价于0 === 6,当然是假的。

false === (false || 6) 等价于false === 6,这显然也是错误的。

(false === false || false === 6) 等价于true || false,这当然是真的。

(0 === 0 || 0 === 6) 也等价于true || false

查找“运算符优先级”。这将帮助您在未来了解 javascript。

【讨论】:

    【解决方案3】:

    首先,你应该知道运营商的优先级。

    其次,你应该知道运算符是如何工作的以及它们返回什么。

    Here is the documentation you can take it as reference.

    console.log( 0 === (0 || 6) );
    // (0 || 6) returns 6 because 0 is falsy,
    // so it becomes 0 === 6. It is obviously return false.
    
    console.log( false === (false || 6) );
    (false || 6) is equals (0 || 6), so we get (false === 6) = false.
    
    console.log( (false === false || false === 6) );
    // this is three part. === is prior to ||, 
    // so we should do (false === false) and (false === 6).
    // (false === false) is true and (false === 6) is false,
    // so we get (true || false) = true
    
    console.log( (0 === 0 || 0 === 6) );
    // (0 === 0) is true and (0 === 6) is false,
    // so true || false is true.

    顺便说一句,大部分的 JavaScript 操作符都做类型转换 两侧是否不是操作员想要的类型。 以下是您可以查看的内容:

    https://javascript.info/type-conversions

    【讨论】:

      【解决方案4】:

      根据您的问题,我猜您不熟悉 ANDOR 的使用或工作方式。

      所以,

      | 代表按位OR

      并且,& 代表按位AND

      AND写成&&OR写成||是一种常用的方法。

      对于AND,以下是场景:

       1 && 1 => 1
       1 && 0 => 0
       0 && 1 => 0
       0 && 0 => 0
      

      对于OR,以下是场景:

       1 || 1 => 1
       1 || 0 => 1
       0 || 1 => 1
       0 || 0 => 0
      

      在上面,1 可以是任何非零整数或值(但我们用 1 表示,表示)。

      所以,如果你写,

      0 === ( 0 || 6 ),

      那么,( 0 || 6 ) 已经是true,那么,如果你将true0 进行比较,那么它总是会是假的。

      然而,如果您将上述条件更改为:

      0 == ( 0 && 6 ), (已编辑)

      ( 0 && 6 ) 变为 false,然后 0 == false 变为 true

      ===== 是不同的,因为第二个只是检查它们是否相等,但它不检查它们是否完全相同。 === 检查值是否相同,意味着完全相同。

      希望我的回答对你有帮助。

      【讨论】:

      • 0 === false 变为 true?你在说什么?
      • @TerryWei 感谢指出我的错误,我已经更新了我的答案,请检查我的答案是否还有其他愚蠢的错误。谢谢。
      猜你喜欢
      • 2015-06-21
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多