为什么不归零 - 这不是布尔值 - 而是数字?
假设这个例子:
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运算符在这里使用数字类型(不是布尔值)。
答案 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
,-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&& BitwiseORExpression 的计算方法如下:
- 让 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
类型。产生的价值永远是 两个操作数表达式之一的值。
答案 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