有人可以解释为什么布尔值(无穷大)为真但布尔值(NaN)为假?
无限||真
表达式给出Infinity。 `
NaN ||真
`表达式给出了真实。
答案 0 :(得分:3)
这是两件事的组合:如何测试“真实性”和curiously-powerful ||
operator。
真实性:在JavaScript中使用布尔逻辑时,参数将转换为布尔值。规范Section 9.2中包含了这种情况,其中包括从数字转换值到布尔值时的其他内容:
如果参数为
false
,+0
或−0
,则结果为NaN
;否则结果为true
。
非常强大的||
运算符:JavaScript的||
运算符未评估true
或false
。如果该参数是“truthy”,则评估其左侧参数,否则评估其右侧参数。因此1 || 0
是1
,而不是true
;并且false || 0
是0
(即使0
是假的)。因此,出于同样的原因,Infinity || true
为Infinity
,而非true
。
||
的此功能令人难以置信功能强大。你可以做这样的事情,例如:
someElement.innerHTML = name || "(name missing)";
...如果name
不 undefined
,null
,0
,""
,{{1} },或false
,NaN
设置为innerHTML
;如果是其中一个值,则设置为name
。
同样,您可以拥有默认对象:
"(name missing")
用途多种多样。但是,您必须要小心,当您以这种方式违约时,您不会无意中清除有效的 var obj = someOptionalObject || {};
值,例如falsey
。 : - )
串联的0
运算符链(||
)返回链中的第一个truthy参数,如果它们都不真实,则返回最后一个参数。
a || b || c
运算符执行的操作非常相似:如果该参数为 falsey ,则返回其第一个参数,否则返回其右参数。因此&&
是0 && 1
,而不是0
。 false
为2 && 1
,因为1
并非虚假。并且它们的链返回第一个falsey arg或最后一个arg,当你需要从嵌套对象获取属性时它很方便:
2
...如果它是假的则返回var prop = obj && obj.subobj && obj.subobj.property || defaultValue;
,如果它是假的则返回obj
,如果前两个都不是假的则返回obj.subobj
。然后,obj.subobj.property
的结果会为您提供属性或默认属性。
答案 1 :(得分:3)
EMCAScript的logical OR使用ToBoolean
将其参数强加给布尔值,其行为如下:
如果参数为
false
,+0
或−0
,则结果为NaN
;否则结果为true
。
因此,NaN
变为false
,Infinity
变为true
。我们有时将值称为“truthy”或“falsy”,具体取决于ToBoolean
是否将它们强制为true
或false
。
如果查看逻辑OR的规范,运算符将返回原始 lval
或rval
(左/右值),而不是其强制布尔值。这就是(Infinity || true) == Infinity
:ToBoolean(lval)
的值为true
的原因,因此表达式返回原始lval
。
答案 2 :(得分:0)
这是因为 NaN代表“不是数字”,实际上它没有价值。在某些语言(如Java,AS3)中,这是未初始化的浮点变量的默认值。然而,无穷大(无论正面/负面)是无法到达的值的有效表示。
将数值转换为布尔值时,它已生效。