为什么 includes() 和 indexOf() 在搜索 NaN 时的工作方式不同?

Why do includes() and indexOf() work differently with searching 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. If x is NaN, return false.
  2. If y is NaN, return false.

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

其中:

  1. If x is NaN and y is NaN, return true.

至于为什么规范允许比较两个不同的 NaN 为真,这取决于 TC。我只能猜测他们是这样做的,因为这是检查数组中是否有 NaN 的便捷方法。