为什么布尔(无限)给出了真实?

时间:2013-07-03 17:12:29

标签: javascript nan infinity

有人可以解释为什么布尔值(无穷大)为真但布尔值(NaN)为假?

  

无限||真

表达式给出Infinity。 `

  

NaN ||真

`表达式给出了真实。

3 个答案:

答案 0 :(得分:3)

这是两件事的组合:如何测试“真实性”和curiously-powerful || operator

  1. 真实性:在JavaScript中使用布尔逻辑时,参数将转换为布尔值。规范Section 9.2中包含了这种情况,其中包括从数字转换值到布尔值时的其他内容:

      

    如果参数为false+0−0,则结果为NaN;否则结果为true

  2. 非常强大的||运算符:JavaScript的||运算符未评估truefalse。如果该参数是“truthy”,则评估其左侧参数,否则评估其右侧参数。因此1 || 01,而不是true;并且false || 00(即使0是假的)。因此,出于同样的原因,Infinity || trueInfinity,而非true

    ||的此功能令人难以置信功能强大。你可以做这样的事情,例如:

    someElement.innerHTML = name || "(name missing)";
    

    ...如果name undefinednull0"",{{1} },或falseNaN设置为innerHTML;如果其中一个值,则设置为name

    同样,您可以拥有默认对象:

    "(name missing")

    用途多种多样。但是,您必须要小心,当您以这种方式违约时,您不会无意中清除有效的 var obj = someOptionalObject || {}; 值,例如falsey。 : - )

    串联的0运算符链(||)返回链中的第一个truthy参数,如果它们都不真实,则返回最后一个参数。

    a || b || c运算符执行的操作非常相似:如果该参数为 falsey ,则返回其第一个参数,否则返回其右参数。因此&&0 && 1,而不是0false2 && 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变为falseInfinity变为true。我们有时将值称为“truthy”或“falsy”,具体取决于ToBoolean是否将它们强制为truefalse

如果查看逻辑OR的规范,运算符将返回原始 lvalrval(左/右值),而不是其强制布尔值。这就是(Infinity || true) == InfinityToBoolean(lval)的值为true的原因,因此表达式返回原始lval

答案 2 :(得分:0)

这是因为 NaN代表“不是数字”,实际上它没有价值。在某些语言(如Java,AS3)中,这是未初始化的浮点变量的默认值。然而,无穷大(无论正面/负面)是无法到达的值的有效表示。

将数值转换为布尔值时,它已生效。