除了提高可读性之外,includesover有什么优势indexOf吗?他们在我看来是一样的。
这有什么区别
var x = [1,2,3].indexOf(1) > -1; //true
还有这个?
var y = [1,2,3].includes(1); //true
除了提高可读性之外,includesover有什么优势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)。