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