Array.prototype.some()
some()
方法是 Array
实例的方法,用于测试数组中是否存在至少一个元素通过提供的函数实现的测试。如果在数组中找到一个元素,其提供的函数返回 true,则返回 true;否则返回 false。它不会修改数组。
试一试
语法
some(callbackFn)
some(callbackFn, thisArg)
参数
返回值
false
,除非 callbackFn
对数组元素返回一个 真值,在这种情况下,会立即返回 true
。
描述
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
使用 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 语言规范 # sec-array.prototype.some |
浏览器兼容性
BCD 表仅在启用 JavaScript 的浏览器中加载。