为什么不为零(不是布尔值),而是一个数字?
假设这个例子:
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
,-0
或NaN
,否则它将被视为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/