我正在学习包含()功能,我找到了这段代码
[NaN].includes(NaN) //True
但是
NaN === NaN // False
为什么这是可行的?
答案 0 :(得分:4)
使用平等NaN === NaN
并使用包含[NaN].includes(NaN)
基本上会提出两个不同的问题:
NaN
是一个非态实体,它描述了不是数值的概念,并且实际上没有可以比较的值。 Equality使用Strict Equality Comparison,并定义在等式的任何一侧x === y
与NaN
的比较始终为false
:
一个。如果x是NaN,则返回false 湾如果y是NaN,则返回false。
但是,要在数组中搜索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 === NaN
和NaN == 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算法。在内部,它检查值的类型