Array.prototype.include vs. Array.prototype.indexOf
2022-08-30 02:12:36
除了提高可读性之外,还有什么优势吗?他们似乎和我一模一样。includes
indexOf
这有什么区别
var x = [1,2,3].indexOf(1) > -1; //true
还有这个?
var y = [1,2,3].includes(1); //true
除了提高可读性之外,还有什么优势吗?他们似乎和我一模一样。includes
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)
这些模式存在两个问题:
- 他们没有“说出你的意思”:你不问数组是否包含一个元素,而是问数组中该元素第一次出现的索引是什么,然后比较它或对它进行位调整,以确定你实际问题的答案。
- 它们对于 失败,因为使用严格相等比较,因此 。
NaN
indexOf
[NaN].indexOf(NaN) === -1
建议的解决方案
我们建议添加一个方法,以便可以将上述模式重写为
Array.prototype.includes
if (arr.includes(el)) { ... }
这与上述语义几乎相同,只是它使用SameValueZero比较算法而不是严格相等比较,因此成为现实。
[NaN].includes(NaN)
因此,该提案解决了现有代码中看到的两个问题。
为了保持一致性,我们还添加了一个类似于 和 的参数。
fromIndex
Array.prototype.indexOf
String.prototype.includes
更多信息:
NaN
使用 indexOf
时将找不到
[NaN].indexOf(NaN) // => -1 (not found)
[NaN].includes(NaN) // => true
includes
如果您想知道在索引位置找到元素,也毫无用处。
arr.indexOf('blah') !== -1
不太可读和可维护。另一方面,执行它所说的操作,很明显它会返回一个 .arr.includes('blah')
boolean
根据这篇关于这个主题的文章,没有明显的区别,尽管可能有点慢。includes
indexOf
是在 之前创建的。includes