title | slug |
---|---|
Array.prototype.some() |
Web/JavaScript/Reference/Global_Objects/Array/some |
{{JSRef}}
some()
方法测试数组中是否至少有一个元素通过了由提供的函数实现的测试。如果在数组中找到一个元素使得提供的函数返回 true,则返回 true;否则返回 false。它不会修改数组。
{{EmbedInteractiveExample("pages/js/array-some.html")}}
some(callbackFn)
some(callbackFn, thisArg)
callbackFn
thisArg
{{optional_inline}}- : 执行
callbackFn
时用作this
的值。参见迭代方法。
- : 执行
如果回调函数对数组中至少一个元素返回一个真值,则返回 true
。否则返回 false
。
some()
方法是一个迭代方法。它为数组中的每个元素调用一次指定的 callbackFn
函数,直到 callbackFn
返回一个真值。如果找到这样的元素,some()
方法将会立即返回 true
并停止遍历数组。否则,如果 callbackFn
对所有元素都返回假值,some()
就会返回 false
。
some()
类似于数学中的“存在量词(∃)”。特别地,在对于一个空数组,任何条件下它都返回 false
。
callbackFn
仅针对已分配值的数组索引调用。它不会为稀疏数组中的空槽调用。
some()
不会改变调用它的数组,但指定的 callbackFn
函数可以。但是请注意,数组的长度是在第一次调用 callbackFn
之前保存的。因此:
- 当开始调用
some()
时,callbackFn
将不会访问超出数组初始长度的任何元素。 - 对已访问索引的更改不会导致再次在这些元素上调用
callbackFn
。 - 如果数组中一个现有的、尚未访问的元素被
callbackFn
更改,则它传递给callbackFn
的值将是该元素被修改后的值。被删除的元素则不会被访问。
Warning
上述类型的并发修改经常导致难以理解的代码,通常应避免(特殊情况除外)。
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()
不会在空槽上运行它的断言函数。
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()
方法读取 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
{{Specifications}}
{{Compat}}
core-js
中Array.prototype.every
的 polyfill- 索引集合类
- {{jsxref("Array")}}
- {{jsxref("Array.prototype.every()")}}
- {{jsxref("Array.prototype.forEach()")}}
- {{jsxref("Array.prototype.find()")}}
- {{jsxref("Array.prototype.includes()")}}
- {{jsxref("TypedArray.prototype.some()")}}