为什么使用includes()和indexOf()搜索NaN时会有不同的结果?

3

//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

那么为什么这两种方法之间会有一些差异呢?

1
这个回答解决了你的问题吗?所有比较操作都返回false的IEEE754 NaN值的理由是什么? - Maksym Shcherban
1个回答

5
基本上,Array.prototype.indexOf使用不同的等值算法,而Array.prototype.includesArray.prototype.indexOf最终使用Number::equal。它执行以下操作:
  1. 如果x是NaN,则返回false。
  2. 如果y是NaN,则返回false。
Array.prototype.includes最终使用Number::sameValueZero
它执行以下操作:
  1. 如果x是NaN且y是NaN,则返回true。
至于为什么规范允许两个不同的NaN比较结果为true,那就取决于TC了。我只能猜测他们这样做是因为这是一种方便检查数组中是否有NaN的方式。

请问,在你的回答中,TC是什么意思?这个缩写代表什么? - Ivan
1
技术委员会。TC39负责ECMA-262(EcmaScript)。 - MinusFour
@Ivan TC39 - Sebastian Simon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接