// Production steps of ECMA-262, Edition 5, 15.4.4.17
// Reference: http://es5.github.io/#x15.4.4.17
if (!Array.prototype.some) {
Array.prototype.some = function(fun/*, thisArg*/) {
'use strict';
if (this == null) {
throw new TypeError('Array.prototype.some called on null or undefined');
}
if (typeof fun !== 'function') {
throw new TypeError();
}
var t = Object(this);
var len = t.length >>> 0;
var thisArg = arguments.length >= 2 ? arguments[1] : void 0;
for (var i = 0; i < len; i++) {
if (i in t && fun.call(thisArg, t[i], i, t)) {
return true;
}
}
return false;
};
}
基础语法
参数说明
在数组每一项上执行的函数,接收 3 个参数:
当前遍历到的元素。
当前遍历到的索引。
数组本身。
可选,指定
callback
的this
参数。返回值说明
如果回调函数返回至少一个数组元素的
truthy
值,则返回true
;否则为false
。注意:对于空数组上的任何条件,此方法返回
false
。详细说明
some()
方法测试是否至少有一个元素可以通过被提供的函数方法。该方法返回一个Boolean
类型的值。some()
为数组中的每一个元素执行一次callback
函数,直到找到一个使得callback
返回一个真值
(即可转换为布尔值true
的值)。如果找到了这样一个值,
some()
将会立即返回true
。否则,
some()
返回false
。callback
只会在那些有值
的索引上被调用,不会在那些被删除或从来未被赋值的索引上调用。callback
被调用时传入三个参数:元素的值
,元素的索引
,被遍历的数组
。将会把它传给被调用的
callback
,作为this
值。否则,在非严格模式下将会是全局对象,严格模式下是undefined
。some()
被调用时不会改变数组。some()
遍历的元素的范围在第一次调用callback
. 时就已经确定了。在调用
some()
后被添加到数组中的值不会被callback
访问到。如果数组中存在且还未被访问到的元素被
callback
改变了,则其传递给callback
的值是some()
访问到它那一刻的值。案例
下面的例子检测在数组中是否有元素大于
10
。此例中为模仿
includes()
方法, 若元素在数组中存在, 则回调函数返回值为true
:Polyfill
在第 5 版时,
some()
被添加进ECMA-262
标准;这样导致某些实现环境可能不支持它。你可以把下面的代码插入到脚本的开头来解决此问题,从而允许在那些没有原生支持它的实现环境中使用它。该算法是
ECMA-262
第 5 版中指定的算法,假定Object
和TypeError
拥有他们的初始值,且fun.call
等价于Function.prototype.call
。