为什么在JavaScript中 "Infinity == Infinity" 会变成true?

3
据我所知,在数学中,InfinityNaN都是模糊的值。 众所周知:
console.log(NaN == NaN); //-> false

console.log(Infinity==Infinity); //-> true

我想知道为什么第二段代码的结果是true。我原本期望的结果是false,但实际上并不是这样。

你能帮我解决一下吗?非常感谢。谢谢。


你是不是指的是Infinity,而不是infinity - TimoStaudinger
@Timo 是的,我指的是"无穷大"。 - reza
从根本上说,NaN代表数值运算的任何可能的非数值结果。NaN不等于NaN更有意义,因为并非每个非数值结果在逻辑上都是等价的。无穷大的定义稍微明确一些,尽管人们可以就无穷大的基数进行争论,但数线的极限概念在数学上更合理地等于自身。 - PMV
4个回答

3
这就是原因:
NaN与任何其他值(包括另一个NaN值)进行比较时都会产生不相等的结果(通过==、!=、===和!==)。使用Number.isNaN()或isNaN()可以最清楚地确定值是否为NaN。或者执行自我比较:只有NaN与自身比较时,结果为不相等。
引用来源:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NaN 初始值为Infinity的值是Number.POSITIVE_INFINITY。Infinity(正无穷大)的值大于任何其他数字。该值在数学上表现为无限大;例如,任何正数乘以Infinity仍为Infinity,除以Infinity的任何值为0。
引用来源:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Infinity 你可能还感兴趣的是使用Number的isFinite方法:
Number.isFinite(Infinity);  // false
Number.isFinite(NaN);       // false

阅读Number.isFinite()的资料: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Number/isFinite


1
这是我个人认为最完整的答案,解释得最好。 - Yuck

1
因为处理器是按照这种方式解释的。JS中的大多数数学运算都遵循IEEE-754浮点数算术规范,处理器以相当特定的方式实现它。这包括NaN !== NaNInfinity === Infinity等内容。

1

无穷大被视为一个数值,所以无穷大==无穷大表示一个数值等于另一个数值。然而,在常规数学中,无穷大是无法与无穷大进行比较的,但在JavaScript中却可以!

另一方面,NaN是一种未定义的变量类型,而不是一个数字。因此,对NaN之间的比较是没有逻辑上的可比性的。正确比较NaN的方法是使用函数isNaN

示例:

isNaN(NaN) // 返回true


这其实并不是真的。InfinityNaN 都是数字和数值。规范只是将 NaN 视为与自身(以及任何其他值)不等。 - Sebastian Simon

1
除了其他答案之外:因为规范是这样规定的。 NaN是JavaScript中唯一与自身不相等的值:

ECMAScript代码测试一个值X是否为NaN的可靠方法是使用表达式X !== X。如果且仅当X为NaN时,结果为真。

http://www.ecma-international.org/ecma-262/5.1/#sec-15.1.2.4


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接