【问题标题】:Why this JavaScript includes() feature make sense?为什么这个 JavaScript includes() 功能有意义?
【发布时间】:2018-04-01 00:15:27
【问题描述】:

我正在学习 includes() 功能,我找到了这段代码

[NaN].includes(NaN) //True

但是

NaN === NaN // False

为什么会这样?

【问题讨论】:

  • 为什么不可能呢?您可以轻松定义自己的值比较逻辑:function isSame(a, b) { return isNaN(a) ? isNaN(b) : a === b;}。如果能做到,语言也能做到。

标签: javascript arrays include nan


【解决方案1】:

使用相等 NaN === NaN 和使用包含 [NaN].includes(NaN) 基本上是在问两个不同的问题:

  1. 平等 - 这些同名的东西实际上是平等的吗?

NaN 是一个无定形实体,它描述了不是数值的概念,实际上并没有可以比较的值。等式使用Strict Equality Comparison,并定义在等式的任何一侧比较x === yNaN 始终为false

一个。如果 x 为 NaN,则返回 false。
湾。如果 y 为 NaN,则返回 false。

  1. 包括 - 数组中是否有带有该“名称”的内容?

但是,要在数组中搜索 NaN,并保持 to Array#includes 仅传递一个参数而不是回调的签名,我们需要一种方法来“命名”我们正在搜索的内容。为此,请根据ECMAScript 2016 (ECMA-262) docs 中的 Array#includes 定义:

includes 方法故意与类似的 indexOf 不同 方法有两种。首先,它使用 SameValueZero 算法, 而不是严格相等比较,允许它检测 NaN 数组元素。其次,它不会跳过丢失的数组元素, 而是将它们视为未定义。

SameValueZero(x, y) 的定义指出,比较时:

如果 x 是 NaN 而 y 是 NaN,则返回 true。

【讨论】:

    【解决方案2】:

    [ NaN ].includes(NaN) 的作用是检查NaN 是否在[ ] 中。

    NaN === NaNNaN == NaN 仍将返回相同的值,即 false。你只需要知道includes 方法检查一个值是否是它被调用的数组。在幕后我认为includes Array 方法使用typeof() 进行检查

    typeof(NaN) // number
    [ NaN ].includes(NaN) // true
    
    typeof("1") // string
    [ 1 ].includes("1") // false
    
    typeof(1) // number
    [ 1 ].includes(1) // true
    

    这是根据includes 方法使用的SameValueZero 算法。它在内部检查值的类型

    【讨论】:

      【解决方案3】:

      https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/isNaN

      与 JavaScript 中的所有其他可能值不同,不可能依靠相等运算符(== 和 ===)来确定值是否为 NaN,因为 NaN == NaN 和 NaN === NaN 评估为假。因此,isNaN 函数的必要性。

      【讨论】:

        猜你喜欢
        • 2021-07-24
        • 1970-01-01
        • 1970-01-01
        • 2016-05-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-28
        • 1970-01-01
        相关资源
        最近更新 更多