有人可以解释一下为什么 Boolean(Infinity) 为真但 Boolean(NaN) 为假?
无穷大|| 真的
表达式给出无穷大。`
南 || 真的
` 表达式为真。
有人可以解释一下为什么 Boolean(Infinity) 为真但 Boolean(NaN) 为假?
无穷大|| 真的
表达式给出无穷大。`
南 || 真的
` 表达式为真。
这是两件事的结合:如何测试“真实性”,以及奇怪强大的||运算符。
真实性:在 JavaScript 中使用布尔逻辑时,参数被转换为布尔值。规范第 9.2 节介绍了这是如何发生的,其中除其他外说,当将值从数字转换为布尔值时:
结果是
false参数是+0,−0还是NaN; 否则结果是true。
奇怪强大的||运算符:JavaScript 的||运算符不会计算为trueor false。如果该论点是“真实的”,则评估其左侧论点,否则评估其右侧论点。1 || 0是这样1,不是true;并且false || 0是0(即使0是假的)。所以出于同样的原因,Infinity || true是Infinity,不是true。
的这个功能||非常强大。你可以做这样的事情,例如:
someElement.innerHTML = name || "(name missing)";
...如果不是name, , , , , or ,被设置为; 如果它是这些值之一,它被设置为. undefinednull0""falseNaNinnerHTMLname"(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)中,这是未初始化浮点变量的默认值。然而,无穷大(无论是正数/负数)是无法达到的值的有效表示。
当您将它们的数值转换为布尔值时,它就生效了。