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

瀏覽器相容性

另見