試一試
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 |
瀏覽器相容性
載入中…