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

Posted

技术标签:

【中文标题】为啥未定义 == 未定义但 NaN != NaN? [复制]【英文标题】:Why is undefined == undefined but NaN != NaN? [duplicate]为什么未定义 == 未定义但 NaN != NaN? [复制] 【发布时间】:2011-11-02 22:31:40 【问题描述】:

我想知道为什么undefined == undefinedNaN != NaN

【问题讨论】:

因为typeof NaN == "number" 不是链接问题的精确副本。没有任何想象力。 人:这不是关于空;这是关于 NaN 的。这是我见过的最不精确的副本。 @Skilldrick,问题是为什么平等就是这样,我认为这是同一个潜在问题。 @zzzzBov 我认为的问题是为什么NaN 不等于NaN 【参考方案1】:

因为它在Abstract Equality Comparison Algorithm 和Strict Equality Comparison Algorithm 中都是这样定义的。

如果===== 的操作数是NaN,则返回false

摘要

如果类型(x)是数字,那么 如果 x 为 NaN,则返回 false。 如果 y 为 NaN,则返回 false。 如果 x 与 y 的数值相同,则返回 true。 如果 x 为 +0 且 y 为 -0,则返回 true。 如果 x 为 -0 且 y 为 +0,则返回 true。 返回 false。

编辑:@CMS 指出的不平等比较的动机是符合 IEEE 754 标准。

来自下面评论中提供的***链接:

...然而,正常的比较操作将 NaN 视为无序并将 -0 和 +0 视为相等。 totalOrder 谓词将对这些情况进行排序,它还区分 NaN 的不同表示以及以不同方式编码的相同十进制浮点数。

【讨论】:

而且是这样定义的,在两个等式算法中只是因为规范符合IEEE 754Number类型标准的规则。 感谢@CMS。我会用你提供的信息更新我的答案。【参考方案2】:

因为Math.sqrt(-5) !== Math.sqrt(-6)

【讨论】:

【参考方案3】:

不知道为什么会这样,但是为了检查某个语句或变量是否为NaN,你应该使用isNaN方法

【讨论】:

【参考方案4】:

我认为是因为 IEEE 标准允许 NaN 的表示形式不止一种。并非所有的 NaN 都彼此相等...

【讨论】:

根据 ECMAScript 规范,所有 NaN 值都无法相互区分(尽管不可否认,实现可能不同):es5.github.com/#x8.5 我不认为无法区分就足以建立平等。这里有逻辑学家肯定知道吗? 恰恰相反:能够与某些人相等但不能与其他人相等将使它们可区分。要么它们必须全部相等,要么它们必须全部不相等才能区分。【参考方案5】:

原因是创建者希望 x == x 返回 false 表示 x 是 NaN,因此 NaN == NaN 必须返回 false 才能保持一致。

【讨论】:

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

Javascript 中 null,NaN和undefined的区别

浅谈NaN和undefined--------与君共勉

关于NaN和isNaN

nan是啥意思

关于NaN和isNaN

JavaScript