在 ECMAScript 2016(ES7)中,新增了一个 Array.prototype.includes() 方法,用于判断一个数组是否包含一个指定的元素,返回一个布尔值。本文将详细介绍该方法的使用及可能存在的坑,并提供示例代码以供参考。
基本用法
Array.prototype.includes() 方法的基本用法很简单,它接受一个参数——要搜索的元素,如果数组中包含该元素,则返回 true,否则返回 false。例如:
const arr = [1, 2, 3]; console.log(arr.includes(2)); // true console.log(arr.includes(4)); // false
可选参数
Array.prototype.includes() 方法还有一个可选参数——起始位置(默认值为 0)。该参数指定从哪个索引开始搜索,如果指定了该参数,则只搜索该索引及之后的元素。例如:
const arr = [1, 2, 3]; console.log(arr.includes(2, 1)); // true console.log(arr.includes(1, 1)); // false
与 indexOf() 方法的区别
Array.prototype.includes() 方法与 indexOf() 方法类似,都是用于搜索数组中是否包含指定元素的方法。它们的主要区别在于:
- Array.prototype.includes() 方法可以正确处理 NaN、-0 和 +0,而 indexOf() 方法不能。
- Array.prototype.includes() 方法的返回值是布尔值,而 indexOf() 方法的返回值是元素在数组中的索引(如果找到),或者 -1(如果没有找到)。
因此,在判断一个数组中是否包含 NaN、-0 或 +0 时,应该使用 Array.prototype.includes() 方法。例如:
const arr = [NaN, 0, -0, 1]; console.log(arr.includes(NaN)); // true console.log(arr.includes(0)); // true console.log(arr.includes(-0)); // true console.log(arr.indexOf(NaN)); // -1 console.log(arr.indexOf(0)); // 1 console.log(arr.indexOf(-0)); // 1
可能存在的坑
Array.prototype.includes() 方法有一个可能存在的坑——它不能正确处理包含对象的数组。例如:
const arr = [{ value: 1 }, { value: 2 }, { value: 3 }]; console.log(arr.includes({ value: 2 })); // false
上述代码中,包含对象的数组 arr 中包含一个 value 属性为 2 的对象,但是 Array.prototype.includes() 方法返回的是 false,因为它判断对象的时候是按照引用地址进行比较的,而不是按照值进行比较的。
解决这个问题的方法有两种:
- 使用 Array.prototype.findIndex() 方法,该方法接受一个回调函数作为参数,用于判断数组中的每个元素是否符合条件,如果找到符合条件的元素,则返回该元素的索引,否则返回 -1。例如:
const arr = [{ value: 1 }, { value: 2 }, { value: 3 }]; console.log(arr.findIndex(item => item.value === 2) !== -1); // true
- 使用第三方库,例如 lodash 的 _.find() 方法,该方法接受一个回调函数作为参数,用于判断数组中的每个元素是否符合条件,如果找到符合条件的元素,则返回该元素,否则返回 undefined。例如:
const arr = [{ value: 1 }, { value: 2 }, { value: 3 }]; console.log(_.find(arr, item => item.value === 2) !== undefined); // true
总结
Array.prototype.includes() 方法是一个非常实用的方法,用于判断一个数组中是否包含一个指定的元素。但是需要注意的是,它不能正确处理包含对象的数组,需要使用 Array.prototype.findIndex() 方法或者第三方库进行处理。希望本文能够对大家理解和使用该方法有所帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/65076c9a95b1f8cacd2d3059