Array.prototype.some()

Baseline 已广泛支持

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 ⁨2015 年 7 月⁩以来,各浏览器均已提供此特性。

some() 方法的 Array 实例会在其找到一个元素满足提供的测试函数时返回 true。否则,它返回 false

试一试

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

语法

js
some(callbackFn)
some(callbackFn, thisArg)

参数

callbackFn

一个为数组中的每个元素执行的函数。它应该返回一个真值来指示元素通过测试,否则返回一个假值。该函数以以下参数调用:

element

数组中正在处理的当前元素。

index

数组中正在处理的当前元素的索引。

array

调用 some() 的数组。

thisArg 可选

在执行 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。

js
function isBiggerThan10(element, index, array) {
  return element > 10;
}

[2, 5, 8, 1, 4].some(isBiggerThan10); // false
[12, 5, 8, 1, 4].some(isBiggerThan10); // true

使用箭头函数测试数组元素

箭头函数为相同的测试提供了更简洁的语法。

js
[2, 5, 8, 1, 4].some((x) => x > 10); // false
[12, 5, 8, 1, 4].some((x) => x > 10); // true

检查数组中是否存在某个值

为了模拟 includes() 方法的功能,此自定义函数会在元素存在于数组中时返回 true

js
const fruits = ["apple", "banana", "mango", "guava"];

function checkAvailability(arr, val) {
  return arr.some((arrVal) => val === arrVal);
}

checkAvailability(fruits, "grapefruit"); // false
checkAvailability(fruits, "banana"); // true

将任何值转换为布尔值

js
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() 检查数组是否严格递增。

js
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() 不会在空槽上运行其谓词。

js
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() 方法会读取 thislength 属性,然后访问小于 length 的所有非负整数键的属性,直到它们都被访问或 callbackFn 返回 true

js
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

浏览器兼容性

另见