除了提高可读性之外,includes
over有什么优势indexOf
吗?他们在我看来是一样的。
这有什么区别
var x = [1,2,3].indexOf(1) > -1; //true
还有这个?
var y = [1,2,3].includes(1); //true
除了提高可读性之外,includes
over有什么优势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 比较算法而不是 Strict Equality Comparison ,从而使
[NaN].includes(NaN)
true 。因此,该提议解决了在现有代码中看到的两个问题。
为了一致性
fromIndex
,我们还添加了一个类似于Array.prototype.indexOf
和的参数String.prototype.includes
。
更多信息:
.indexOf()
和.includes()
方法可用于搜索数组中的元素或搜索给定字符串中的字符/子字符串。
(链接到 ECMAScript 规范)
indexOf
使用严格相等比较而includes
使用SameValueZero算法。由于这个原因,出现了以下两点差异。
正如Felix Kling所指出的,在 的情况下,行为是不同的NaN
。
let arr = [NaN];
arr.indexOf(NaN); // returns -1; meaning NaN is not present
arr.includes(NaN); // returns true
undefined
。let arr = [ , , ];
arr.indexOf(undefined); // returns -1; meaning undefined is not present
arr.includes(undefined); // returns true
(链接到 ECMAScript 规范)
1. 如果您将 RegExp 传递给indexOf
,它会将 RegExp 视为字符串并返回字符串的索引(如果找到)。但是,如果您将 RegExp 传递给includes
,它将引发异常。
let str = "javascript";
str.indexOf(/\w/); // returns -1 even though the elements match the regex because /\w/ is treated as string
str.includes(/\w/); // throws TypeError: First argument to String.prototype.includes must not be a regular expression
正如GLAND_PROPRE指出的那样,includes
可能比(因为它需要检查正则表达式作为第一个参数)慢一点(非常小),indexOf
但实际上,这没有太大区别,可以忽略不计。
String.prototype.includes()
在 ECMAScript 2015Array.prototype.includes()
中引入,而在 ECMAScript 2016 中引入。关于浏览器支持,请明智地使用它们。
String.prototype.indexOf()
并且Array.prototype.indexOf()
出现在 ECMAScript 的 ES5 版本中,因此被所有浏览器支持。
从概念上讲,当您想使用 indexOf 位置时,您应该使用 indexOf 只是让您提取值或对数组进行操作,即在获得元素位置后使用切片、移位或拆分。另一方面,使用 Array.includes 只知道值是否在数组内而不是位置,因为您不关心它。
indexOf()
和includes()
都可以用于查找数组中的元素,但是每个函数产生不同的返回值。
indexOf
返回一个数字(-1
如果元素不存在于数组中,或者如果元素存在则返回数组位置)。
includes()
返回一个布尔值(true
或false
)。