有人可以解释一下为什么 Boolean(Infinity) 为真但 Boolean(NaN) 为假?
无穷大|| 真的
表达式给出无穷大。`
南 || 真的
` 表达式为真。
有人可以解释一下为什么 Boolean(Infinity) 为真但 Boolean(NaN) 为假?
无穷大|| 真的
表达式给出无穷大。`
南 || 真的
` 表达式为真。
这是两件事的结合:如何测试“真实性”,以及奇怪强大的||
运算符。
真实性:在 JavaScript 中使用布尔逻辑时,参数被转换为布尔值。规范第 9.2 节介绍了这是如何发生的,其中除其他外说,当将值从数字转换为布尔值时:
结果是
false
参数是+0
,−0
还是NaN
; 否则结果是true
。
奇怪强大的||
运算符:JavaScript 的||
运算符不会计算为true
or false
。如果该论点是“真实的”,则评估其左侧论点,否则评估其右侧论点。1 || 0
是这样1
,不是true
;并且false || 0
是0
(即使0
是假的)。所以出于同样的原因,Infinity || true
是Infinity
,不是true
。
的这个功能||
非常强大。你可以做这样的事情,例如:
someElement.innerHTML = name || "(name missing)";
...如果不是name
, , , , , or ,被设置为; 如果它是这些值之一,它被设置为. undefined
null
0
""
false
NaN
innerHTML
name
"(name missing")
同样,您可以拥有默认对象:
var obj = someOptionalObject || {};
用途多种多样。但是,您必须小心,不要无意中清除有效值 falsey
,例如0
当您以这种方式默认事物时。:-)
||
串在一起的运算符链( a || b || c
) 返回链中的第一个真实参数,或者如果它们都不是真实的,则返回最后一个参数。
操作符做了一些非常相似的&&
事情:如果第一个参数是falsey,它返回它的第一个参数,否则返回它的正确参数。0 && 1
是这样0
,不是false
。2 && 1
是1
,因为2
不是假的。它们的链返回第一个错误的 arg 或最后一个 arg,当您需要从嵌套对象中获取属性时,这很方便:
var prop = obj && obj.subobj && obj.subobj.property || defaultValue;
...obj
如果它是假的,或者obj.subobj
如果它是假的,或者obj.subobj.property
如果前两个都不是假的,则返回。然后,结果会|| defaultValue
为您提供属性或默认值。
EMCAScript 的逻辑 OR使用 将其参数转换为布尔值ToBoolean
,对于数字,其行为如下:
结果是
false
参数是+0
,−0
还是NaN
; 否则结果是true
。
因此,NaN
变成false
,Infinity
变成true
。我们有时将值称为“真实”或“虚假”,具体取决于是否ToBoolean
将它们强制为true
或false
。
如果您查看逻辑 OR 的规范,则运算符返回原始 lval
或rval
(左/右值),而不是其强制布尔值。这就是为什么(Infinity || true) == Infinity
: 的值ToBoolean(lval)
是true
,所以表达式返回原来的值lval
。
这是因为NaN 代表“不是数字”,实际上它没有任何价值。在某些语言(如 Java、AS3)中,这是未初始化浮点变量的默认值。然而,无穷大(无论是正数/负数)是无法达到的值的有效表示。
当您将它们的数值转换为布尔值时,它就生效了。