1腊尚、Array.from()-用于將兩類對(duì)象轉(zhuǎn)為真正的數(shù)組:類似數(shù)組的對(duì)象(array-like object)和可遍歷(iterable)的對(duì)象(包括 ES6 新增的數(shù)據(jù)結(jié)構(gòu) Set 和 Map)喜每。
let arrayLike = {
????'0': 'a',
????'1': 'b',
????'2': 'c',
????length: 3
};
// ES5的寫(xiě)法
var arr1 = [].slice.call(arrayLike);? ?// ['a', 'b', 'c']
// ES6的寫(xiě)法
let arr2 = Array.from(arrayLike);? ?// ['a', 'b', 'c']
實(shí)際應(yīng)用中间护,常見(jiàn)的類似數(shù)組的對(duì)象是 DOM 操作返回的 NodeList 集合企蹭,以及函數(shù)內(nèi)部的arguments對(duì)象铐拐。Array.from都可以將它們轉(zhuǎn)為真正的數(shù)組。
// NodeList對(duì)象
let ps = document.querySelectorAll('p');
Array.from(ps).filter(p => { return p.textContent.length > 100;});
?// arguments對(duì)象
function foo() { var args = Array.from(arguments); // ...}
2练对、Array.of()-用于將一組值,轉(zhuǎn)換為數(shù)組吹害。
這個(gè)方法的主要目的螟凭,是彌補(bǔ)數(shù)組構(gòu)造函數(shù)Array()的不足。因?yàn)閰?shù)個(gè)數(shù)的不同它呀,會(huì)導(dǎo)致Array()的行為有差異螺男。
Array() // []
Array(3) // [, , ,]
Array(3, 11, 8) // [3, 11, 8]?
上面代碼中棒厘,Array方法沒(méi)有參數(shù)、一個(gè)參數(shù)下隧、三個(gè)參數(shù)時(shí)奢人,返回結(jié)果都不一樣。只有當(dāng)參數(shù)個(gè)數(shù)不少于 2 個(gè)時(shí)淆院,Array()才會(huì)返回由參數(shù)組成的新數(shù)組何乎。參數(shù)個(gè)數(shù)只有一個(gè)時(shí),實(shí)際上是指定數(shù)組的長(zhǎng)度土辩。Array.of基本上可以用來(lái)替代Array()或new Array()支救,并且不存在由于參數(shù)不同而導(dǎo)致的重載。它的行為非常統(tǒng)一拷淘。?
3各墨、find(fn, thisObj) 和 finfIndex(fn, thisObj)
? ? 3.1、find()-用于找出第一個(gè)符合條件的數(shù)組成員启涯。它的參數(shù)是一個(gè)回調(diào)函數(shù)贬堵,所有數(shù)組成員依次執(zhí)行該回調(diào)函數(shù),直到找出第一個(gè)返回值為true的成員结洼,然后返回該成員黎做。如果沒(méi)有符合條件的成員,則返回undefined补君。
? ? 3.2引几、findIndex()-返回第一個(gè)符合條件的數(shù)組成員的位置,如果所有成員都不符合條件挽铁,則返回-1伟桅。
注意:這兩個(gè)方法都可以接受第二個(gè)參數(shù),用來(lái)綁定回調(diào)函數(shù)的this對(duì)象叽掘。
4楣铁、fill(value, start, end)-用value值從start位置填充到end,不包含end位置的值更扁。
注意盖腕,如果填充的類型為對(duì)象,那么被賦值的是同一個(gè)內(nèi)存地址的對(duì)象浓镜,而不是深拷貝對(duì)象溃列。
5、entries()膛薛,keys() 和 values()
6听隐、includes()
Array.prototype.includes方法返回一個(gè)布爾值,表示某個(gè)數(shù)組是否包含給定的值哄啄,與字符串的includes方法類似雅任。ES2016 引入了該方法风范。
[1,2,3].includes(2) // true
[1,2,3].includes(4) // false
[1,2,NaN].includes(NaN) // true
該方法的第二個(gè)參數(shù)表示搜索的起始位置,默認(rèn)為0沪么。如果第二個(gè)參數(shù)為負(fù)數(shù)硼婿,則表示倒數(shù)的位置,如果這時(shí)它大于數(shù)組長(zhǎng)度(比如第二個(gè)參數(shù)為-4禽车,但數(shù)組長(zhǎng)度為3)寇漫,則會(huì)重置為從0開(kāi)始。
[1,2,3].includes(3,3); // false
[1,2,3].includes(3,-1); // true
沒(méi)有該方法之前哭当,我們通常使用數(shù)組的indexOf方法猪腕,檢查是否包含某個(gè)值。
if (arr.indexOf(el) !== -1) { // ...}?
indexOf方法有兩個(gè)缺點(diǎn)钦勘,一是不夠語(yǔ)義化陋葡,它的含義是找到參數(shù)值的第一個(gè)出現(xiàn)位置,所以要去比較是否不等于-1彻采,表達(dá)起來(lái)不夠直觀腐缤。二是,它內(nèi)部使用嚴(yán)格相等運(yùn)算符(===)進(jìn)行判斷肛响,這會(huì)導(dǎo)致對(duì)NaN的誤判岭粤。
[NaN].indexOf(NaN)// -1?
includes使用的是不一樣的判斷算法,就沒(méi)有這個(gè)問(wèn)題特笋。
[NaN].includes(NaN)// true?
下面代碼用來(lái)檢查當(dāng)前環(huán)境是否支持該方法剃浇,如果不支持,部署一個(gè)簡(jiǎn)易的替代版本猎物。
const contains = (() =>
?????Array.prototype.includes ?
????(arr, value) => arr.includes(value) :
????(arr, value) => arr.some(el => el === value)
)();
contains(['foo', 'bar'], 'baz'); // => false?
另外虎囚,Map 和 Set 數(shù)據(jù)結(jié)構(gòu)有一個(gè)has方法,需要注意與includes區(qū)分蔫磨。
- Map 結(jié)構(gòu)的has方法淘讥,是用來(lái)查找鍵名的,比如Map.prototype.has(key)堤如、WeakMap.prototype.has(key)蒲列、Reflect.has(target, propertyKey)。
- Set 結(jié)構(gòu)的has方法搀罢,是用來(lái)查找值的蝗岖,比如Set.prototype.has(value)、WeakSet.prototype.has(value)榔至。?
7剪侮、flat()-如下圖所示
只會(huì)“拉平”一層,如果想要“拉平”多層的嵌套數(shù)組,可以將flat()方法的參數(shù)寫(xiě)成一個(gè)整數(shù)瓣俯,表示想要拉平的層數(shù),默認(rèn)為1兵怯。
[1, 2, [3, [4, 5]]].flat()// [1, 2, 3, [4, 5]]
[1, 2, [3, [4, 5]]].flat(2)// [1, 2, 3, 4, 5]
文章內(nèi)容摘至阮一峰老師的es6