Array.prototype.includes与Array.prototype.indexOf

除了改进的可读性之外,还有没有优于indexOf ? 他们看起来和我一样。

这有什么区别

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

和这个?

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

tl; dr: NaN被区别对待:

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

从提案 :

动机

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

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

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

这些模式performance出两个问题:

  • 它们不能“说出你的意思”:不是询问数组是否包含一个元素,而是询问该数组中第一次出现该元素的索引是什么,然后比较该元素或者将其比特位转换,以确定你的实际问题的答案。
  • 它们失败的NaN ,因为indexOf使用严格平等比较,因此[NaN].indexOf(NaN) === -1

build议的解决scheme

我们build议添加一个Array.prototype.includes方法,以便上面的模式可以被重写为

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

除了它使用SameValueZero比较algorithm而不是严格平等比较之外,它具有与上述几乎相同的语义,从而使[NaN].includes(NaN)真。

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

我们另外添加一个fromIndex参数,类似于Array.prototype.indexOfString.prototype.includes ,以保持一致性。


更多信息:

  • SameValueZeroalgorithm
  • Strict Equality Comparisonalgorithm

如果你想知道性能,这里是一个JSperftesting,倾向于显示更多的时间通过,更includes()将比indexOf更快。

JSperf

恕我直言,我也喜欢写if (arr.includes(el)) {}因为它比if (arr.indexOf(el) !== -1) {}更清晰和更易维护if (arr.indexOf(el) !== -1) {}