为啥 NaN === NaN 是假的? [复制]

Posted

技术标签:

【中文标题】为啥 NaN === NaN 是假的? [复制]【英文标题】:Why is NaN === NaN false? [duplicate]为什么 NaN === NaN 是假的? [复制] 【发布时间】:2013-11-26 04:18:08 【问题描述】:

为什么NaN === NaNjavascript 中返回 false

> undefined === undefined
true
> NaN === NaN
false
> a = NaN
NaN
> a === a
false

在documentation page 我看到了这个:

针对 NaN 进行测试

等式运算符(=====)不能用于针对 NaN 测试值。请改用isNaN

是否有任何参考资料可以回答这个问题?会很受欢迎的。

【问题讨论】:

因为 Not a Number 不是数字,也不等于任何东西,包括 Not a Number @Joren - 这不是 JS 特定的。 相关:destroyallsoftware.com/talks/wat 看看这个精彩的视频 ;-) destroyallsoftware.com/talks/wat NaN 是唯一的数字是 NaN :-) 要检查某物是否为 NaN,请测试 isNaN(value) && typeof value=='number' 【参考方案1】:

严格回答:因为JS规范says so:

如果类型(x)是数字,那么 如果 x 为 NaN,则返回 false。 如果 y 是 NaN,则返回 false。

有用的答案:浮点数的 IEEE 754 规范(所有语言都使用浮点数)说 NaN 永远不相等。

【讨论】:

另外,它是定义自然数的公理的一部分。查看第二个项目符号:en.wikipedia.org/wiki/Peano_axioms#Formulation @Loupax 这有什么关系? NaN 不是自然数。不是数字吗?这里有一个我没听懂的笑话吗? @GrantGryczan 我什至不记得我当时的想法。现在我只是认为这是“仅仅因为相等运算符旁边的 NaN 不是数字,这并不意味着它们是相同的非数字”,就这样吧 JavaScript 自动类型转换将 NaN 转换为数字,因此检查数字是否不是数字将始终 b false。和NaN !== NaN 将是真的。【参考方案2】:

此行为由IEEE-754 standard(JavaScript 规范在这方面遵循)指定。

更多讨论请见What is the rationale for all comparisons returning false for IEEE754 NaN values?

【讨论】:

【参考方案3】:

虽然NaN===NaN 的任一侧包含相同的值并且它们的类型是Number,但它们并不相同。根据 ECMA-262,===== 的任一侧包含 NaN 则将导致错误值。

您可以在此处找到详细规则-

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

【讨论】:

以上是关于为啥 NaN === NaN 是假的? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥未定义 == 未定义但 NaN != NaN? [复制]

为啥 NaN 大于 JavaScript 中的任何数字? [复制]

为啥我在 GAN 的训练鉴别器和生成器中得到 nan 损失值? [复制]

为啥 Object.prototype instanceof Object 是假的?

为啥 type(nil)==nil 是假的?

为啥 Object.Equals(new Object(), new Object()) 是假的?