为什么这个JavaScript包含()功能有意义?

时间:2017-10-19 20:50:27

标签: javascript arrays include nan

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

[NaN].includes(NaN) //True

但是

NaN === NaN // False

为什么这是可行的?

3 个答案:

答案 0 :(得分:4)

使用平等NaN === NaN并使用包含[NaN].includes(NaN)基本上会提出两个不同的问题:

  1. 平等 - 具有相同名称的东西实际上是否相等?
  2. NaN是一个非态实体,它描述了不是数值的概念,并且实际上没有可以比较的值。 Equality使用Strict Equality Comparison,并定义在等式的任何一侧x === yNaN的比较始终为false

      

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

    1. 包含 - 我在数组中有“名称”吗?
    2. 但是,要在数组中搜索NaN并保持to Array#包含只传递一个param而不是回调的签名,我们需要一种方法来“命名”我们正在搜索的内容对于。为了实现这一点,根据数组#包括ECMAScript 2016 (ECMA-262) docs中的定义:

        

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

      SameValueZero(x, y)的定义表明在比较时:

        

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

答案 1 :(得分:0)

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

  

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

答案 2 :(得分:0)

[ 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算法。在内部,它检查值的类型