1

有人可以解释一下为什么 Boolean(Infinity) 为真但 Boolean(NaN) 为假?

无穷大|| 真的

表达式给出无穷大。`

南 || 真的

` 表达式为真。

4

3 回答 3

3

这是两件事的结合:如何测试“真实性”,以及奇怪强大的||运算符

  1. 真实性:在 JavaScript 中使用布尔逻辑时,参数被转换为布尔值。规范第 9.2 节介绍了这是如何发生的,其中除其他外说,当将值从数字转换为布尔值时:

    结果是false参数是+0,−0还是NaN; 否则结果是true

  2. 奇怪强大的||运算符:JavaScript 的||运算符不会计算为trueor false。如果该论点是“真实的”,则评估其左侧论点,否则评估其右侧论点。1 || 0是这样1,不是true;并且false || 00(即使0是假的)。所以出于同样的原因,Infinity || trueInfinity,不是true

    的这个功能||非常强大。你可以做这样的事情,例如:

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

    ...如果不是name, , , , , or ,被设置为; 如果它这些值之一,它被设置为. undefinednull0""falseNaNinnerHTMLname"(name missing")

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

    var obj = someOptionalObject || {};
    

    用途多种多样。但是,您必须小心,不要无意中清除有效值 falsey,例如0当您以这种方式默认事物时。:-)

    ||串在一起的运算符链( a || b || c) 返回链中的第一个真实参数,或者如果它们都不是真实的,则返回最后一个参数。

    操作符做了一些非常相似的&&事情:如果第一个参数是falsey,它返回它的第一个参数,否则返回它的正确参数。0 && 1是这样0,不是false2 && 11,因为2不是假的。它们的链返回第一个错误的 arg 或最后一个 arg,当您需要从嵌套对象中获取属性时,这很方便:

    var prop = obj && obj.subobj && obj.subobj.property || defaultValue;
    

    ...obj如果它是假的,或者obj.subobj如果它是假的,或者obj.subobj.property如果前两个都不是假的,则返回。然后,结果会|| defaultValue为您提供属性或默认值。

于 2013-07-03T17:15:27.227 回答
3

EMCAScript 的逻辑 OR使用 将其参数转换为布尔值ToBoolean,对于数字,其行为如下:

结果是false参数是+0,−0还是NaN; 否则结果是true

因此,NaN变成falseInfinity变成true。我们有时将值称为“真实”或“虚假”,具体取决于是否ToBoolean将它们强制为truefalse

如果您查看逻辑 OR 的规范,则运算符返回原始 lvalrval(左/右值),而不是其强制布尔值。这就是为什么(Infinity || true) == Infinity: 的值ToBoolean(lval)true,所以表达式返回原来的值lval

于 2013-07-03T17:16:55.677 回答
0

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

当您将它们的数值转换为布尔值时,它就生效了。

于 2013-07-03T17:17:32.140 回答