为什么这个JavaScript包含()功能有意义?
我了解包括()功能,我发现这个代码为什么这个JavaScript包含()功能有意义?
[NaN].includes(NaN) //True
但
NaN === NaN // False
这是为什么更多钞票?
使用平等NaN === NaN
和使用包括[NaN].includes(NaN)
基本上要求两个不同的问题:
- 平等 - 这东西有相同的名称实际上是平等的吗?
NaN
是一个无定形实体,它描述了不是数值的概念,并且实际上没有可以比较的值。平等使用Strict Equality Comparison,并定义在等式的任何一侧的比较x === y
与NaN
总是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。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/isNaN
不像在JavaScript中的所有其他可能的值,它是不可能依靠相等运算符(==和===)来确定一个值是否是NaN或没有,因为两者的NaN == NaN和NaN === NaN评估为false。因此,isNaN函数的必要性。
[ NaN ].includes(NaN)
这是做什么检查NaN
是否在[ ]
。
NaN === NaN
和NaN == 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
阵列方法做它的检查。它在内部检查值的类型
为什么不可能?你可以很容易地定义你自己的比较值的逻辑:'function isSame(a,b){return isNaN(a)? isNaN(b):a === b;}'。如果你能做到这一点,那么语言也可以做到。 –