【问题标题】:Why do includes() and indexOf() work differently with searching NaN? [duplicate]为什么 includes() 和 indexOf() 在搜索 NaN 时的工作方式不同? [复制]
【发布时间】:2021-10-22 16:36:24
【问题描述】:

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

那么为什么这两种方法有一些区别呢?

【问题讨论】:

标签: javascript arrays indexof


【解决方案1】:

基本上,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 的便捷方法。

【讨论】:

  • 请问,您的回答中的 TC 是什么意思?这个缩写是什么意思?
  • 技术委员会。 TC39 负责 ECMA-262 (EcmaScript)
  • @Ivan TC39.
猜你喜欢
  • 1970-01-01
  • 2021-04-12
  • 2023-03-06
  • 2011-12-21
  • 2015-11-01
  • 2013-12-23
  • 2021-06-18
  • 1970-01-01
相关资源
最近更新 更多