为什么不为零(不是布尔值),而是一个数字?

假设这个例子:

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运算符在这里如何使用数字类型(不是布尔值)。

最佳答案

逻辑运算符同时评估左表达式和右表达式(如有必要)。它们都立即短路。这意味着,如果第一个表达式本身足以产生结果,则与另一个表达式无关,则根本不会对另一个表达式求值。例如,在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 &&
  按位计算ORExpression的方式如下:
  
  
  令lref为评估LogicalANDExpression的结果。
  令lval为GetValue(lref)。
  如果ToBoolean(lval)为false,则返回lval。
  令rref为评估BitwiseORExpression的结果。
  返回GetValue(rref)。
  
  
  生产LogicalORExpression:LogicalORExpression ||
  LogicalANDExpression的评估如下:
  
  
  令lref为评估LogicalORExpression的结果。
  令lval为GetValue(lref)。
  如果ToBoolean(lval)为true,则返回lval。
  令rref为评估LogicalANDExpression的结果。
  返回GetValue(rref)。
  
  
  注意由&&||运算符产生的值不一定是Boolean类型。产生的价值将永远是
  两个操作数表达式之一的值。

关于javascript - 为什么在OR条件下不考虑零而在AND条件下考虑零?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23464984/

10-11 06:10