为什么 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
。哪个:
- If x is NaN, return false.
- If y is NaN, return false.
虽然 Array.prototype.includes
最终使用 Number::sameValueZero
其中:
- If x is NaN and y is NaN, return true.
至于为什么规范允许比较两个不同的 NaN 为真,这取决于 TC。我只能猜测他们是这样做的,因为这是检查数组中是否有 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
。哪个:
- If x is NaN, return false.
- If y is NaN, return false.
虽然 Array.prototype.includes
最终使用 Number::sameValueZero
其中:
- If x is NaN and y is NaN, return true.
至于为什么规范允许比较两个不同的 NaN 为真,这取决于 TC。我只能猜测他们是这样做的,因为这是检查数组中是否有 NaN
的便捷方法。