1. 程式人生 > >ES6-陣列的擴充套件-陣列例項的includes()

ES6-陣列的擴充套件-陣列例項的includes()

Array.prototype.includes 方法返回一個布林值,表示某個陣列是否包含給定的值,與字串的 includes 方法類似。ES6引入了該方法。

[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)。