找出JavaScript数组是否包含值的最简洁,最有效的方法是什么?

这是我知道的唯一方法:

function contains(a, obj) {
for (var i = 0; i < a.length; i++) {
if (a[i] === obj) {
return true;
}
}
return false;}

有没有更好,更简洁的方法来实现这一目标?

现代的浏览器Array#includes,这不正是这一点,得到广泛支持的人,除IE:

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

您也可以使用Array#indexOf,它不太直接,但对于过时的浏览器不需要使用polyfill。


许多框架还提供类似的方法:

注意,有些框架将此功能实现为一个函数,而另一些框架则将该函数添加到数组原型中。

从2019年开始更新:这个答案来自2008年(11岁!),与现代JS使用无关。承诺的性能改进基于当时在浏览器中完成的基准测试。它可能与现代JS执行上下文无关。如果您需要简单的解决方案,请寻找其他答案。如果您需要最佳性能,请在相关执行环境中为自己设定基准。

就像其他人所说的那样,遍历数组可能是最好的方法,但是事实证明,递减while循环是JavaScript中最快的迭代方法。因此,您可能希望按如下所示重写代码:

function contains(a, obj) {
var i = a.length;
while (i--) {
 if (a[i] === obj) {
 return true;
 }
}
return false;}

当然,您也可以扩展Array原型:

Array.prototype.contains = function(obj) {
var i = this.length;
while (i--) {
if (this[i] === obj) {
return true;
}
}
return false;}

现在,您可以简单地使用以下内容:

alert([1, 2, 3].contains(2)); // => truealert([1, 2, 3].contains('2')); // => false

ECMAScript 7引入了Array.prototype.includes。

可以这样使用:

[1, 2, 3].includes(2); // true[1, 2, 3].includes(4); // false

它还接受一个可选的第二个参数fromIndex:

[1, 2, 3].includes(3, 3); // false[1, 2, 3].includes(3, -1); // true

不像indexOf,它采用严格相等比较,includes比较了使用SameValueZero平等算法。这意味着您可以检测数组是否包含NaN:

[1, 2, NaN].includes(NaN); // true

也不同于indexOf,includes不会跳过缺少的索引:

new Array(5).includes(undefined); // true

目前,它仍然是草稿,但可以对其进行多填充以使其在所有浏览器上均可使用。