ES7 更新:使用 Array.prototype.includes 代替 Array.indexOf 为何更好

在 ES7 中,一个新的方法被添加到了 Array 原型对象上:Array.prototype.includes(). 这个新的方法可以代替以前常用的 Array.indexOf() 方法。在本文中,我们将深入探讨这个新方法为什么更好,以及如何使用它。

1. 简介

Array.prototype.includes() 是一个用来判断数组中是否包含特定元素的方法。与 Array.indexOf() 不同的是,Array.prototype.includes() 返回一个布尔值,而非元素的下标。

Array.prototype.includes() 接受两个参数:要搜索的元素和可选的起始位置。如果不指定起始位置,默认从数组的头部开始搜索。

这个方法受到了 ECMAScript 2016 标准的支持。因此,只有支持 ES6 或更高版本的浏览器才能使用。

2. 优点

相对于 Array.indexOf() 方法,Array.prototype.includes() 有一些优点:

2.1 更加简洁

Array.prototype.includes() 方法调用更为简单,而且更加直观。与 Array.indexOf() 不同的是,不需要检查返回值是否为 -1。这可以让你的代码更加简洁。

2.2 不需要手动转换成布尔值

Array.prototype.includes() 方法会自动将返回值转换成布尔值。这个特性可以节省时间并减少代码量。

2.3 更加易读

由于 Array.prototype.includes() 相对于 Array.indexOf() 更加简洁,因此更容易读懂。这可以让你的代码更加易于维护。

3. 示例代码

下面是一个使用 Array.indexOf() 方法的示例代码:

var array = [1, 2, 3, 4, 5];

if (array.indexOf(3) !== -1) {
  console.log('The array contains 3.');
} else {
  console.log('The array does not contain 3.');
}

下面是同样的代码,但是使用 Array.prototype.includes() 方法:

var array = [1, 2, 3, 4, 5];

if (array.includes(3)) {
  console.log('The array contains 3.');
} else {
  console.log('The array does not contain 3.');
}

两行代码都会输出 “The array contains 3.”。但从示例可以看到,使用 Array.prototype.includes() 方法更加简洁和易读。

4. 注意事项

在使用 Array.prototype.includes() 方法时,需要注意以下几个方面:

4.1 区分返回值为 0 的情况

当要搜索的元素在数组的第一个位置时,Array.prototype.includes() 方法返回的是 0。这个返回值应该区分于返回值为 -1 的情况。

以下代码示范如何避免这个问题:

var array = [0, 1, 2, 3];

if (array.includes(0) || array.indexOf(0) === 0) {
  console.log('The array contains 0.');
} else {
  console.log('The array does not contain 0.');
}

4.2 不支持第二个参数为负数

当指定起始位置为负数时,Array.prototype.includes() 方法会将其自动转换成负数的绝对值。因此,如果你需要搜索的元素位于数组的倒数第二位或之前,应该使用 Array.lastIndexOf() 方法。

5. 经验总结

在本文中,我们介绍了 Array.prototype.includes() 方法,并与传统的 Array.indexOf() 方法进行了比较。我们发现,Array.prototype.includes() 相较于 Array.indexOf() 更加简洁、易读、并且不需要手动转换成布尔值。使用 Array.prototype.includes() 可以帮助你减少冗余代码,并使你的代码更加整洁易读。

当你在编写 JavaScript 代码时,如果需要搜索数组并返回一个布尔值,那么请考虑使用 Array.prototype.includes() 方法。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65b5ffecadd4f0e0ffeb74c2