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) > -1是false -
[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.indexOf和String.prototype.includes,以保持一致性。
更多信息:
-
SameValueZeroalgorithm -
Strict Equality Comparisonalgorithm
如果你想知道性能,这里是一个JSperftesting,倾向于显示更多的时间通过,更includes()将比indexOf更快。
JSperf
恕我直言,我也喜欢写if (arr.includes(el)) {}因为它比if (arr.indexOf(el) !== -1) {}更清晰和更易维护if (arr.indexOf(el) !== -1) {}