JavaScript中如何检查数组是否包含某个值

JavaScript中如何检查数组是否包含某个值

技术背景

在JavaScript开发中,经常会遇到需要检查数组是否包含某个特定值的需求。随着JavaScript的发展,有多种方法可以实现这一功能,不同的方法在兼容性、性能和使用场景上有所差异。

实现步骤

使用 Array.prototype.includes

这是ES2016引入的原生方法,用于判断数组是否包含某个元素。它使用 SameValueZero 算法进行比较,可以检测 NaN,并且不跳过缺失的索引。

1
console.log(['joe', 'jane', 'mary'].includes('jane')); // true

使用 Array.prototype.indexOf

该方法返回指定元素在数组中首次出现的索引,如果未找到则返回 -1。通过判断返回值是否大于等于 0 来确定数组是否包含该元素。

1
console.log(['joe', 'jane', 'mary'].indexOf('jane') >= 0); // true

使用框架提供的方法

许多流行的JavaScript框架也提供了类似的方法:

  • jQuery: $.inArray(value, array, [fromIndex])
  • Underscore.js: _.contains(array, value)(也别名为 _.include_.includes
  • Dojo Toolkit: dojo.indexOf(array, value, [fromIndex, findLast])
  • Prototype: array.indexOf(value)
  • MooTools: array.indexOf(value)
  • MochiKit: findValue(array, value)
  • MS Ajax: array.indexOf(value)
  • Ext: Ext.Array.contains(array, value)
  • Lodash: _.includes(array, value, [from])(4.0.0 之前为 _.contains
  • Ramda: R.includes(value, array)

自定义函数实现

可以通过循环遍历数组来检查元素是否存在。

1
2
3
4
5
6
7
8
9
function contains(a, obj) {
var i = a.length;
while (i--) {
if (a[i] === obj) {
return true;
}
}
return false;
}

使用 Array.prototype.some

该方法用于测试数组中是否至少有一个元素通过了提供的函数测试。可以用于查找包含某些特性的对象。

1
2
const items = [ {a: '1'}, {a: '2'}, {a: '3'} ];
items.some(item => item.a === '3'); // returns true

核心代码

以下是一些核心代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 使用 includes
[1, 2, 3].includes(2); // true

// 使用 indexOf
[1, 2, 3].indexOf(2) >= 0; // true

// 自定义 contains 函数
function contains(a, obj) {
var i = a.length;
while (i--) {
if (a[i] === obj) {
return true;
}
}
return false;
}
contains([1, 2, 3], 2); // true

// 使用 some
const items = [ {a: '1'}, {a: '2'}, {a: '3'} ];
items.some(item => item.a === '3'); // true

最佳实践

  • 兼容性优先:如果需要兼容旧浏览器(如IE),可以使用 Array.prototype.indexOf 或自定义循环函数。
  • 性能优先:对于性能敏感的场景,可参考性能测试结果。一般来说,基于 for 循环和 indexOf 的方法在各浏览器上对于大小数组都有较好的性能表现。
  • 代码简洁性:在现代浏览器环境下,优先使用 Array.prototype.includes,代码更简洁易读。

常见问题

扩展 Array 原型的问题

扩展 Array 对象的原型可能会引入新属性到 for-in 循环中,从而破坏现有脚本。如果需要考虑与页面上其他JavaScript代码的兼容性,建议使用独立函数而不是扩展原型。

性能差异问题

不同方法在不同浏览器和不同数组大小下的性能表现不同。例如,JSONSetfind 方法在各浏览器上性能较慢;es6includes 方法在Chrome上较快。在实际使用中,建议根据具体的执行环境进行性能测试,选择最合适的方法。


JavaScript中如何检查数组是否包含某个值
https://119291.xyz/posts/2025-05-08.how-to-check-if-array-includes-value-in-javascript/
作者
ww
发布于
2025年5月8日
许可协议