为什么include()和indexOf()与搜索NaN的工作方式不同?



//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。是:

  1. 如果x是NaN,返回false
  2. 如果y是NaN,返回false。

Array.prototype.includes最终使用Number::sameValueZero

:

  1. 如果x是NaN, y是NaN,返回true

至于为什么规格允许对两种不同的nan进行比较,这取决于TC。我只能猜测他们是这样做的,因为这是一种方便的方法来检查数组中是否有NaN

最新更新