【问题标题】: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

标签: javascript


【解决方案1】:

因为它在Abstract Equality Comparison AlgorithmStrict 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 才能保持一致。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-13
        • 1970-01-01
        • 2016-12-04
        • 2020-03-12
        • 2021-08-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-23
        相关资源
        最近更新 更多