试一试
const array = [1, 2, 3, 4, 5];
// Checks whether an element is even
const even = (element) => element % 2 === 0;
console.log(array.some(even));
// Expected output: true
语法
some(callbackFn)
some(callbackFn, thisArg)
参数
callbackFnthisArg可选-
在执行
callbackFn时用作this的值。请参阅 迭代方法。
返回值
false,除非 callbackFn 为数组元素返回真值,在这种情况下会立即返回 true。
描述
some() 方法是一种迭代方法。它为数组中的每个元素调用一次提供的 callbackFn 函数,直到 callbackFn 返回真值。如果找到这样的元素,some() 会立即返回 true 并停止迭代数组。否则,如果 callbackFn 对所有元素都返回假值,some() 则返回 false。请阅读迭代方法部分以获取有关这些方法如何工作的更多信息。
some() 的作用类似于数学中的“存在量词”。特别是,对于空数组,它对任何条件都返回 false。
callbackFn 仅对具有已赋值的数组索引调用。对于稀疏数组中的空槽,它不会被调用。
some() 不会改变其被调用的数组,但提供的 callbackFn 函数可以。但是请注意,数组的长度是在第一次调用 callbackFn 之前保存的。因此:
callbackFn不会访问在调用some()开始时添加到数组超出初始长度的任何元素。- 对已访问索引的更改不会导致
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, "grapefruit"); // 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
使用 callbackFn 的第三个参数
如果您想访问数组中的另一个元素,特别是当您没有指向该数组的现有变量时,array 参数非常有用。以下示例首先使用 filter() 提取正值,然后使用 some() 检查数组是否严格递增。
const numbers = [3, -1, 1, 4, 1, 5];
const isIncreasing = !numbers
.filter((num) => num > 0)
.some((num, idx, arr) => {
// Without the arr argument, there's no way to easily access the
// intermediate array without saving it to a variable.
if (idx === 0) return false;
return num <= arr[idx - 1];
});
console.log(isIncreasing); // false
在稀疏数组上使用 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 属性,然后访问小于 length 的所有非负整数键的属性,直到它们都被访问或 callbackFn 返回 true。
const arrayLike = {
length: 3,
0: "a",
1: "b",
2: "c",
3: 3, // ignored by some() since length is 3
};
console.log(Array.prototype.some.call(arrayLike, (x) => typeof x === "number"));
// false
规范
| 规范 |
|---|
| ECMAScript® 2026 语言规范 # sec-array.prototype.some |
浏览器兼容性
加载中…