數組實例的 includes()
Array.prototype.includes
方法返回一個布爾值,表示某個數組是否包含給定的值,與字符串的includes
方法類似。ES2016 引入了該方法。
[1, 2, 3].includes(2) // true [1, 2, 3].includes(4) // false [1, 2, NaN].includes(NaN) // true
該方法的第二個參數表示搜索的起始位置,默認為0
。如果第二個參數為負數,則表示倒數的位置,如果這時它大於數組長度(比如第二個參數為-4
,但數組長度為3
),則會重置為從0
開始。
[1, 2, 3].includes(3, 3); // false [1, 2, 3].includes(3, -1); // true
沒有該方法之前,我們通常使用數組的indexOf
方法,檢查是否包含某個值。
if (arr.indexOf(el) !== -1) { // ... }
indexOf
方法有兩個缺點,一是不夠語義化,它的含義是找到參數值的第一個出現位置,所以要去比較是否不等於-1
,表達起來不夠直觀。二是,它內部使用嚴格相等運算符(===
)進行判斷,這會導致對NaN
的誤判。
[NaN].indexOf(NaN) // -1
includes
使用的是不一樣的判斷算法,就沒有這個問題。
[NaN].includes(NaN) // true
下面代碼用來檢查當前環境是否支持該方法,如果不支持,部署一個簡易的替代版本。
const contains = (() => Array.prototype.includes ? (arr, value) => arr.includes(value) : (arr, value) => arr.some(el => el === value) )(); contains(['foo', 'bar'], 'baz'); // => false
另外,Map 和 Set 數據結構有一個has
方法,需要注意與includes
區分。
- Map 結構的
has
方法,是用來查找鍵名的,比如Map.prototype.has(key)
、WeakMap.prototype.has(key)
、Reflect.has(target, propertyKey)
。 - Set 結構的
has
方法,是用來查找值的,比如Set.prototype.has(value)
、WeakSet.prototype.has(value)
。
let a = new Set([1, 2, 3]);
let b = new Set([3, 5, 2]);
// 並集 let unionSet = new Set([...a, ...b]); //[1,2,3,5]
// 交集 let intersectionSet = new Set([...a].filter(x => b.has(x))); // [2,3]
// ab差集 let differenceABSet = new Set([...a].filter(x => !b.has(x)));
some()
方法測試數組中的某些元素是否通過由提供的函數實現的測試。
注意:對於放在空數組上的任何條件,此方法返回false
。
var array = [1, 2, 3, 4, 5];
var even = function(element) {
// checks whether an element is even
return element % 2 === 0;
};
console.log(array.some(even));
// expected output: true
描述
some
為數組中的每一個元素執行一次 callback
函數,直到找到一個使得 callback 返回一個“真值”(即可轉換為布爾值 true 的值)。如果找到了這樣一個值,some
將會立即返回 true
。否則,some
返回 false
。callback
只會在那些”有值“的索引上被調用,不會在那些被刪除或從來未被賦值的索引上調用。
callback
被調用時傳入三個參數:元素的值,元素的索引,被遍歷的數組。
如果為 some
提供了一個 thisArg
參數,將會把它傳給被調用的 callback
,作為 this
值。否則,在非嚴格模式下將會是全局對象,嚴格模式下是 undefined
。
some
被調用時不會改變數組。
some
遍歷的元素的范圍在第一次調用 callback
. 時就已經確定了。在調用 some
后被添加到數組中的值不會被 callback
訪問到。如果數組中存在且還未被訪問到的元素被 callback
改變了,則其傳遞給 callback
的值是 some
訪問到它那一刻的值。