【问题标题】:Why does Boolean(Infinity) gives true?为什么 Boolean(Infinity) 给出真值?
【发布时间】:2013-07-01 12:17:07
【问题描述】:

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

无穷大||真的

表达式给出无穷大。 `

NaN ||真的

` 表达式为真。

【问题讨论】:

  • ecma-international.org/ecma-262/5.1/#sec-9.2: ToBoolean(Number): The result is false if the argument is +0, −0, or NaN; otherwise the result is true.
  • 因为Infinity 是一个相当大的数字,而NaN 的名字中甚至还有“not”...?
  • 请告诉我们这很重要的情况是什么?

标签: javascript nan infinity


【解决方案1】:

这是两件事的结合:如何测试“真实性”,以及curiously-powerful || operator

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

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

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

    || 的这个功能难以置信强大。例如,您可以执行以下操作:

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

    ...如果namenot,则undefinednull0""falseNaNinnerHTML 被设置给name;如果它这些值之一,它被设置为"(name missing")

    同样,你可以有默认对象:

    var obj = someOptionalObject || {};
    

    用途多种多样。但是,您必须小心,当您以这种方式默认设置时,不要无意中清除了falsey 之类的0 值。 :-)

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

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

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

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

【讨论】:

  • 可能值得注意的是&& 的行为方式几乎相同(返回使布尔表达式短路的元素的值)NaN && true 将返回NaN|| 可用于默认设置,&& 可用于空值检查。 if (a && a.b && a.b.c)
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-11-17
      • 2018-06-06
      • 2015-12-24
      • 1970-01-01
      • 1970-01-01
      • 2018-01-02
      • 1970-01-01
      • 1970-01-01
      • 2016-09-03
      相关资源
      最近更新 更多