Array.prototype.include vs. Array.prototype.indexOf

2022-08-30 02:12:36

除了提高可读性之外,还有什么优势吗?他们似乎和我一模一样。includesindexOf

这有什么区别

var x = [1,2,3].indexOf(1) > -1; //true

还有这个?

var y = [1,2,3].includes(1); //true

答案 1

tl;dr: 以不同的方式处理:NaN

  • [NaN].indexOf(NaN) > -1false
  • [NaN].includes(NaN)true

提案中:

动机

使用 ECMAScript 数组时,通常需要确定数组是否包含元素。其主要模式是

if (arr.indexOf(el) !== -1) {
    ...
}

具有各种其他可能性,例如,甚至。arr.indexOf(el) >= 0~arr.indexOf(el)

这些模式存在两个问题:

  • 他们没有“说出你的意思”:你不问数组是否包含一个元素,而是问数组中该元素第一次出现的索引是什么,然后比较它或对它进行位调整,以确定你实际问题的答案。
  • 它们对于 失败,因为使用严格相等比较,因此 。NaNindexOf[NaN].indexOf(NaN) === -1

建议的解决方案

我们建议添加一个方法,以便可以将上述模式重写为Array.prototype.includes

if (arr.includes(el)) {
    ...
}

这与上述语义几乎相同,只是它使用SameValueZero比较算法而不是严格相等比较,因此成为现实。[NaN].includes(NaN)

因此,该提案解决了现有代码中看到的两个问题。

为了保持一致性,我们还添加了一个类似于 和 的参数。fromIndexArray.prototype.indexOfString.prototype.includes


更多信息:


答案 2

技术

NaN使用 indexOf将找不到

[NaN].indexOf(NaN) // => -1 (not found)
[NaN].includes(NaN) // => true

includes如果您想知道在索引位置找到元素,也毫无用处。

可读性

arr.indexOf('blah') !== -1不太可读和可维护。另一方面,执行它所说的操作,很明显它会返回一个 .arr.includes('blah')boolean

性能

根据这篇关于这个主题的文章没有明显的区别,尽管可能有点慢。includes

历史

indexOf是在 之前创建的。includes