//indexOf()
console.log([1, 2, NaN].indexOf(NaN)); //-1
//includes()
console.log([1, 2, NaN].includes(NaN)); //true
我不明白为什么includes
可以在数组中找到NaN,而indexOf
不能。
我读到它正在发生,因为indexOf
内部使用严格相等算子(NaN === NaN)。但是对于我来说,当我们讨论NaN
时,严格相等算子和抽象相等算子并没有区别。NaN
不可能等于它自己。
//strict equality operator
console.log(NaN === NaN); //false
//abstract equality operator
console.log(NaN == NaN); //still false
那么为什么这两种方法之间存在一些差异呢?
基本上,Array.prototype.indexOf
使用的相等算法与Array.prototype.includes
不同。
Array.prototype.indexOf
最终使用Number::equal
。是:
- 如果x是NaN,返回false
- 如果y是NaN,返回false。
而Array.prototype.includes
最终使用Number::sameValueZero
:
- 如果x是NaN, y是NaN,返回true
至于为什么规格允许对两种不同的nan进行比较,这取决于TC。我只能猜测他们是这样做的,因为这是一种方便的方法来检查数组中是否有NaN
。