158

除了提高可读性之外,还有什么优势includesindexOf?他们似乎和我一模一样。

这有什么区别

var x = [1,2,3].indexOf(1) > -1; //true

和这个?

var y = [1,2,3].includes(1); //true
4

10 回答 10

183

tl; dr: NaN被区别对待:

  • [NaN].indexOf(NaN) > -1false
  • [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)真。

因此,这个提议解决了现有代码中的两个问题。

为了保持一致性,我们还添加了一个fromIndex类似于Array.prototype.indexOfand的参数。String.prototype.includes


更多信息:

于 2016-02-12T19:10:02.953 回答
28

技术上

NaN使用时找不到indexOf

[NaN].indexOf(NaN) // => -1 (not found)
[NaN].includes(NaN) // => true

includes如果您想知道在哪里找到元素的索引,也没有用。

可读性

arr.indexOf('blah') !== -1可读性和可维护性较差。另一方面,按照arr.includes('blah')它所说的去做,很明显它返回了一个boolean.

表演

根据这篇关于该主题的文章,虽然速度可能会慢一点,但没有明显的区别。includes

历史

indexOf以前创建的方式includes

于 2017-07-23T11:47:59.237 回答
13

.indexOf().includes()方法可用于搜索数组中的元素或搜索给定字符串中的字符/子字符串。

数组中的用法

链接到 ECMAScript 规范)

  1. indexOf使用严格相等比较,而includes使用SameValueZero算法。因此,产生以下两点不同。

  2. 正如Felix Kling所指出的,在NaN.

let arr = [NaN];

arr.indexOf(NaN); // returns -1; meaning NaN is not present
arr.includes(NaN); // returns true
  1. 情况下的行为也不同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 版本中,因此受到所有浏览器的支持。

于 2019-05-18T02:33:41.967 回答
7

从概念上讲,当您想使用位置时,您应该使用 indexOf indexOf 只是让您提取值或对数组进行操作,即在获得元素位置后使用切片、移位或拆分。另一方面,使用 Array.includes 只知道值是否在数组内部而不是位置,因为您不关心它。

于 2017-12-18T03:31:23.887 回答
2

indexOf()并且includes()都可以用于查找数组中的元素,但是每个函数产生不同的返回值。

indexOf返回一个数字(-1如果数组中不存在元素,如果元素存在则返回数组位置)。

includes()返回一个布尔值(truefalse)。

于 2020-04-26T07:11:49.217 回答
1

Internet Explorer 不支持包含,如果这有助于您决定。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes#Browser_compatibility

于 2020-10-06T16:14:50.263 回答
1

答案和例子都很棒。但是(乍一看),这让我误解includestrue使用undefined.

因此,我包含了详细说明的示例,包括可用于检查未定义和 NaN 值,其中 indexOf不能

//Array without undefined values and without NaN values. 
//includes will return false because there are no NaN and undefined values

const myarray = [1,2,3,4]

console.log(myarray.includes(undefined)) //returns false
console.log(myarray.includes(NaN)) //returns false


//Array with undefined values and Nan values.
//includes will find them and return true

const myarray2 = [1,NaN, ,4]

console.log(myarray2.includes(undefined)) //returns true
console.log(myarray2.includes(NaN)) //returns true


console.log(myarray2.indexOf(undefined) > -1) //returns false
console.log(myarray2.indexOf(NaN) > -1) //returns false

概括

  • includes 用于检查数组中的未定义和 NaN 值
  • indexOf 不能用于检查数组中的未定义和 NaN 值
于 2021-06-23T06:02:38.997 回答
0
 
let allGroceries = ['tomato', 'baked bean',];
 
//returns true or false
console.log(allGroceries.includes("tomato")); //uses boolean value to check 

let fruits2 = ["apple", "banana", "orange"];
console.log(fruits2.includes("banana"));
// returns true because banana is in the array



//.indexOf returns the index of the value

console.log(allGroceries.indexOf("tomato"));//returns the index of the value
//returns -1 because tomato is not in the array
//fromIndex
console.log(allGroceries.indexOf("tomato", 2));


于 2022-01-10T11:07:05.387 回答
0

indexOf 是检查数组中是否有东西的旧方法,新方法更好,因为您不必为存在 (-1) 编写条件,这就是为什么使用返回您的 include() 方法的原因布尔值。

array.indexOf('something')      // return index or -1
array.includes('something')     // return true of false

因此,对于查找索引,第一种方法更好,但对于检查是否存在,第二种方法更有用。

于 2021-04-21T07:55:01.383 回答
0

包括使用自动类型转换,即在字符串和数字之间。indexOf 没有。

于 2021-12-17T13:26:44.290 回答