Array.prototype.some()
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.
some()
方法测试数组中是否至少有一个元素通过了由提供的函数实现的测试。如果在数组中找到一个元素使得提供的函数返回 true,则返回 true;否则返回 false。它不会修改数组。
尝试一下
语法
some(callbackFn)
some(callbackFn, thisArg)
参数
返回值
如果回调函数对数组中至少一个元素返回一个真值,则返回 true
。否则返回 false
。
描述
some()
方法是一个迭代方法。它为数组中的每个元素调用一次指定的 callbackFn
函数,直到 callbackFn
返回一个真值。如果找到这样的元素,some()
方法将会立即返回 true
并停止遍历数组。否则,如果 callbackFn
对所有元素都返回假值,some()
就会返回 false
。
some()
类似于数学中的“存在量词(∃)”。特别地,在对于一个空数组,任何条件下它都返回 false
。
callbackFn
仅针对已分配值的数组索引调用。它不会为稀疏数组中的空槽调用。
some()
不会改变调用它的数组,但指定的 callbackFn
函数可以。但是请注意,数组的长度是在第一次调用 callbackFn
之前保存的。因此:
- 当开始调用
some()
时,callbackFn
将不会访问超出数组初始长度的任何元素。 - 对已访问索引的更改不会导致再次在这些元素上调用
callbackFn
。 - 如果数组中一个现有的、尚未访问的元素被
callbackFn
更改,则它传递给callbackFn
的值将是该元素被修改后的值。被删除的元素则不会被访问。
警告:上述类型的并发修改经常导致难以理解的代码,通常应避免(特殊情况除外)。
some()
方法是通用的。它只期望 this
值具有 length
属性和整数键属性。
示例
测试数组元素的值
下面的例子检测在数组中是否有元素大于 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
:
const fruits = ["apple", "banana", "mango", "guava"];
function checkAvailability(arr, val) {
return arr.some((arrVal) => val === arrVal);
}
checkAvailability(fruits, "kela"); // false
checkAvailability(fruits, "banana"); // true
将任意值转换为布尔类型
const TRUTHY_VALUES = [true, "true", 1];
function getBoolean(value) {
if (typeof value === "string") {
value = value.toLowerCase().trim();
}
return TRUTHY_VALUES.some((t) => t === value);
}
getBoolean(false); // false
getBoolean("false"); // false
getBoolean(1); // true
getBoolean("true"); // true
在稀疏数组上使用 some()
some()
不会在空槽上运行它的断言函数。
console.log([1, , 3].some((x) => x === undefined)); // false
console.log([1, , 1].some((x) => x !== 1)); // false
console.log([1, undefined, 1].some((x) => x !== 1)); // true
在非数组对象上调用 some()
some()
方法读取 this
的 length
属性,然后访问每个整数索引,直到到达末尾或 callbackFn
返回 true
。
const arrayLike = {
length: 3,
0: "a",
1: "b",
2: "c",
};
console.log(Array.prototype.some.call(arrayLike, (x) => typeof x === "number"));
// false
规范
Specification |
---|
ECMAScript Language Specification # sec-array.prototype.some |
浏览器兼容性
BCD tables only load in the browser