为什么在OR条件下计算时不考虑零,并考虑在AND条件下计算?

时间:2014-05-05 04:50:41

标签: javascript

为什么不归零 - 这不是布尔值 - 而是数字?

假设这个例子:

var current = 0;
current += Number(3) || Number(4); // now current is 0 + 3 = 3

var current = 0;
current += Number(-3) || Number(4); // now current is 0 + -3 = -3

var current = 0;
current += Number(0) || Number(4); // now current is 0 + 4 = 4

因此,在我的示例中,它将添加值,该数字不为零。

所以,我的问题是为什么实际上OR运算符||只是将值计算为而不是零?

而且,

var current = 0;
current += Number(0) && Number(3); // now current is 0

var current = 0;
current += Number(3) && Number(5); //now current is 5 

我真的很困惑AND和OR运算符在这里使用数字类型(不是布尔值)。

3 个答案:

答案 0 :(得分:3)

逻辑运算符计算左右表达式(如有必要)。它们都立即短路。这意味着,如果第一个表达式本身足以产生结果,而不管其他表达式如何,则根本不会评估另一个表达式。例如,在OR运算符中,如果第一个表达式是Truthy,那么我们不必在AND运算符中以相同的方式计算另一个表达式,如果第一个表达式是Falsy,我们不必评估另一个表达

现在,我们谈论的是Truthy和Falsy,对吗?这些是什么?当我们评估表达式时,真实性由下表根据ECMA 5.1 Standard specification确定,

+-----------------------------------------------------------------------+
| Argument Type | Result                                                |
|:--------------|------------------------------------------------------:|
| Undefined     | false                                                 |
|---------------|-------------------------------------------------------|
| Null          | false                                                 |
|---------------|-------------------------------------------------------|
| Boolean       | The result equals the input argument (no conversion). |
|---------------|-------------------------------------------------------|
| Number        | The result is false if the argument is +0, −0, or NaN;|
|               | otherwise the result is true.                         |
|---------------|-------------------------------------------------------|
| String        | The result is false if the argument is the empty      |
|               | String (its length is zero); otherwise the result is  |
|               | true.                                                 |
|---------------|-------------------------------------------------------|
| Object        | true                                                  |
+-----------------------------------------------------------------------+

因此,除非数字为+0-0NaN,否则将被视为Truthy。您可以像这样确认

console.log(Boolean(0));
# false
console.log(Boolean(-1));
# true
console.log(Boolean(100));
# true

这就是OR运算符取非零数值的原因。

引自ECMA 5.1 Specifications for OR Operator

LogicalANDExpression :
    BitwiseORExpression
    LogicalANDExpression && BitwiseORExpression

LogicalORExpression :
    LogicalANDExpression
    LogicalORExpression || LogicalANDExpression
     

生产 LogicalANDExpression:LogicalANDExpression&&   BitwiseORExpression 的计算方法如下:

     
      
  1. lref 成为评估 LogicalANDExpression 的结果。
  2.   
  3. lval 成为 GetValue(lref)
  4.   
  5. 如果 ToBoolean(lval)为false,则返回 lval
  6.   
  7. rref 成为评估 BitwiseORExpression 的结果。
  8.   
  9. 返回 GetValue(rref)
  10.         

    生产 LogicalORExpression:LogicalORExpression ||   LogicalANDExpression 评估如下:

         
        
    1. lref 成为评估 LogicalORExpression 的结果。
    2.   
    3. lval 成为 GetValue(lref)
    4.   
    5. 如果 ToBoolean(lval) true ,请返回 lval
    6.   
    7. rref 成为评估 LogicalANDExpression 的结果。
    8.   
    9. 返回 GetValue(rref)
    10.         

      注意 &&||运算符生成的值不一定是Boolean类型。产生的价值永远是   两个操作数表达式之一的值。

答案 1 :(得分:2)

OR语句的值在您遇到的时刻确定" true" (零以外的东西......' truthy')。在你遇到这种情况之前,你需要坚持下去:也许其他一个术语是真的吗?

这解释了您所看到的行为。

current += Number(3) || Number(4)        - 3 is true, condition met, no need to look at next term

current += Number(0) || Number(4)        - 0 is false, keep going, 4 is true, condition met

来自https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_Operators

  

逻辑运算符通常与布尔(逻辑)值一起使用;   当它们是时,它们返回一个布尔值。然而,&&和||   运算符实际上返回一个指定操作数的值,   因此,如果这些运算符与非布尔值一起使用,它们可能会   返回非布尔值。

答案 2 :(得分:0)

我认为零被设置为虚假条件而其他所有条件都设置为真实条件,而我们对Number使用AND或OR运算符。

考虑以下计算值:

当我们取数字时,记住0是假的,所有其他值(包括负值)都是真的。 另外,假设以下数字不是布尔数。

5 || 0 // true || false returns true, so takes 5
0 || 3 // false || true returns true, so takes 3
4 && 0 // true && false returns false, so takes 0
0 && 6 // false && true returns false, so takes 0
2 && 3 // true && true returns true, which value would take???? 
      // Ummm, last defined value, huh i.e. 3