array.some
array.some
some()
方法测试数组中的某些元素是否通过由提供的函数实现的测试。
function isBiggerThan10(element, index, array) {
return element > 10;
}
[2, 5, 8, 1, 4].some(isBiggerThan10 // false
[12, 5, 8, 1, 4].some(isBiggerThan10 // true
语法
arr.some(callback[, thisArg])
参数
callback
测试每个元素的函数,取三个参数:
返回值
true
如果回调函数返回任何数组元素的值; 否则,false
。
描述
some
为数组中的每一个元素执行一次 callback
函数,直到找到一个使得 callback
返回一个“真值”(即可转换为布尔值 true
的值)。如果找到了这样一个值,some
将会立即返回 true
。否则,some
返回false
。callback
只会在那些”有值“的索引上被调用,不会在那些被删除或从来未被赋值的索引上调用。
callback
被调用时传入三个参数:元素的值,元素的索引,被遍历的数组。
如果为some
提供了一个 thisArg
参数,将会把它传给被调用的 callback
,作为 this
值。否则,在非严格模式下将会是全局对象,严格模式下是undefined
。
some
被调用时不会改变数组。
some
遍历的元素的范围在第一次调用 callback
. 时就已经确定了。在调用some
后被添加到数组中的值不会被callback
访问到。如果数组中存在且还未被访问到的元素被callback
改变了,则其传递给callback
的值是some
访问到它那一刻的值。
示例
测试数组元素的值
下面的例子检测在数组中是否有元素大于 10。
function isBiggerThan10(element, index, array) {
return element > 10;
}
[2, 5, 8, 1, 4].some(isBiggerThan10 // false
[12, 5, 8, 1, 4].some(isBiggerThan10 // true
使用箭头函数测试数组元素
箭头函数为相同测试提供了一个更短的语法。
[2, 5, 8, 1, 4].some(x => x > 10 // false
[12, 5, 8, 1, 4].some(x => x > 10 // true
检查数组中是否存在值
为了模仿includes()
的功能,如果元素存在于数组中,则此自定义函数将返回true
:
var fruits = ['apple', 'banana', 'mango', 'guava'];
function checkAvailability(arr, val) {
return arr.some(function(arrVal) {
return val === arrVal;
}
}
checkAvailability(fruits, 'kela' // false
checkAvailability(fruits, 'banana' // true
使用箭头函数检查值是否存在
var fruits = ['apple', 'banana', 'mango', 'guava'];
function checkAvailability(arr, val) {
return arr.some(arrVal => val === arrVal
}
checkAvailability(fruits, 'kela' // false
checkAvailability(fruits, 'banana' // true
将任何值转换为布尔值
var TRUTHY_VALUES = [true, 'true', 1];
function getBoolean(a) {
'use strict';
var value = a;
if (typeof value === 'string') {
value = value.toLowerCase().trim(
}
return TRUTHY_VALUES.some(function(t) {
return t === value;
}
}
getBoolean(false // false
getBoolean('false' // false
getBoolean(1 // true
getBoolean('true' // true
Polyfill
在第 5 版时,some
被添加进 ECMA-262 标准;这样导致某些实现环境可能不支持它。你可以把下面的代码插入到脚本的开头来解决此问题,从而允许在那些没有原生支持它的实现环境中使用它。该算法是 ECMA-262 第 5 版中指定的算法,假定 Object
和 TypeError
拥有他们的初始值,且 fun.call
等价于 Function.prototype.call。
// 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;
};
}
规范
Specification | Status | Comment |
---|---|---|
ECMAScript 5.1 (ECMA-262)The definition of 'Array.prototype.some' in that specification. | Standard | Initial definition. Implemented in JavaScript 1.6. |
ECMAScript 2015 (6th Edition, ECMA-262)The definition of 'Array.prototype.some' in that specification. | Standard | |
ECMAScript Latest Draft (ECMA-262)The definition of 'Array.prototype.some' in that specification. | Living Standard | |
浏览器兼容性
Feature | Chrome | Edge | Firefox | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|---|
Basic Support | (Yes) | (Yes) | 1.5 | 9 | (Yes) | (Yes) |
Feature | Android | Chrome for Android | Edge mobile | Firefox for Android | IE mobile | Opera Android | iOS Safari |
---|---|---|---|---|---|---|---|
Basic Support | (Yes) | (Yes) | (Yes) | 1 | (Yes) | (Yes) | (Yes) |