2017-10-19 142 views
3

我了解包括()功能,我发现这个代码为什么这个JavaScript包含()功能有意义?

[NaN].includes(NaN) //True

NaN === NaN // False

这是为什么更多钞票?

+2

为什么不可能?你可以很容易地定义你自己的比较值的逻辑:'function isSame(a,b){return isNaN(a)? isNaN(b):a === b;}'。如果你能做到这一点,那么语言也可以做到。 –

回答

4

使用平等NaN === NaN和使用包括[NaN].includes(NaN)基本上要求两个不同的问题:

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

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

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

  • 包括 - 我有与数组中的 “名” 的东西吗?
  • 然而,搜索阵列中的一个NaN,并保持到阵列#包括仅通过一个特性参数的签名,而不是回调,我们需要一种方法来“名”就是我们正在寻找。为了做到这一点,ccording到Array#包括在ECMAScript 2016 (ECMA-262) docs定义:

    该方法包括有意地以两种方式类似的indexOf 方法不同。首先,它使用SameValueZero算法 代替严格平等比较,允许它检测NaN 数组元素。其次,它不会跳过丢失数组元素, 而是将它们视为未定义。

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

    如果x是NaN和y是NaN,返回true。

    0

    [ NaN ].includes(NaN)这是做什么检查NaN是否在[ ]

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

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

    此根据SameValueZero算法,该includes方法使用includes阵列方法做它的检查。它在内部检查值的类型