// Prefixing the method with '_' to avoid name clashes
Object.defineProperty(Array.prototype, '_includes', { value: function (v) { return this.indexOf(v) !== -1 }})
array._includes(3) // true
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.prototype.contains = function(obj) {
var i = this.length;
while (i--) {
if (this[i] === obj) {
return true;
}
}
return false;
}
21条答案
按热度按时间csbfibhn16#
假设您定义了这样一个数组:
下面是三种检查是否存在错误的方法
3
在那里。他们也都回来了true
或false
.本机数组方法(自es2016起)(兼容性表)
作为自定义数组方法(es2016之前)
简单函数
ldfqzlk817#
最上面的答案假定为基本类型,但如果您想知道数组是否包含具有某种特征的对象,则array.prototype.some()是一个优雅的解决方案:
这样做的好处是,一旦找到元素,迭代就会中止,从而避免了不必要的迭代周期。
而且,它非常适合一个
if
语句,因为它返回布尔值:Array.prototype.some()
完全支持:caniuse.com支持表9cbw7uwe18#
ecmascript 7引入了
Array.prototype.includes
.它可以这样使用:
它还接受可选的第二个参数
fromIndex
:不像
indexOf
,它使用严格的相等比较,includes
使用samevaluezero相等算法进行比较。这意味着您可以检测数组是否包含NaN
:也不像
indexOf
,includes
不跳过缺少的索引:目前,它仍然是一个草稿,但可以进行多填充以使其在所有浏览器上工作。
iyzzxitl19#
现代浏览器有
Array#includes
,它正是这样做的,并且得到了除ie以外的所有人的广泛支持:你也可以使用
Array#indexOf
,它不太直接,但对于过时的浏览器不需要多边形填充。许多框架也提供类似的方法:
jquery:
$.inArray(value, array, [fromIndex])
下划线.js:_.contains(array, value)
(别名为_.include
及_.includes
)dojo工具包:
dojo.indexOf(array, value, [fromIndex, findLast])
原型:array.indexOf(value)
mootools:array.indexOf(value)
mochikit:findValue(array, value)
ms ajax:array.indexOf(value)
提取:Ext.Array.contains(array, value)
洛达斯:_.includes(array, value, [from])
(是_.contains
先前版本(4.0.0)拉姆达:
R.includes(value, array)
请注意,一些框架将此作为函数实现,而另一些框架将此函数添加到阵列原型中。20jt8wwn20#
indexOf
也许吧,但它是“ecma-262标准的javascript扩展;因此,它可能不会出现在标准的其他实现中。”例子:
afaics microsoft不提供某种替代方案,但您可以在internet explorer(以及其他不支持此功能的浏览器)的阵列中添加类似的功能
indexOf
)如果你想的话,就像谷歌快速搜索显示的那样(例如,这一个)。t30tvxxf21#
2019年更新:此答案来自2008年(11岁!)与现代js用法无关。承诺的性能改进是基于当时浏览器中的基准测试。它可能与现代js执行上下文无关。如果你需要一个简单的解决方案,寻找其他答案。如果您需要最佳性能,请在相关的执行环境中为自己进行基准测试。
正如其他人所说,通过数组进行迭代可能是最好的方法,但已经证明
while
循环是javascript中最快的迭代方式。因此,您可能希望按如下方式重写代码:当然,您也可以扩展阵列原型:
现在,您可以简单地使用以下各项: