为啥未定义 == 未定义但 NaN != NaN? [复制]
Posted
技术标签:
【中文标题】为啥未定义 == 未定义但 NaN != NaN? [复制]【英文标题】:Why is undefined == undefined but NaN != NaN? [duplicate]为什么未定义 == 未定义但 NaN != NaN? [复制] 【发布时间】:2011-11-02 22:31:40 【问题描述】:我想知道为什么undefined == undefined
而NaN != 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? [复制]的主要内容,如果未能解决你的问题,请参考以下文章