为啥 NaN === NaN 是假的? [复制]
Posted
技术标签:
【中文标题】为啥 NaN === NaN 是假的? [复制]【英文标题】:Why is NaN === NaN false? [duplicate]为什么 NaN === NaN 是假的? [复制] 【发布时间】:2013-11-26 04:18:08 【问题描述】:为什么NaN === NaN
在 javascript 中返回 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 损失值? [复制]