8.1擴(kuò)展運(yùn)算符
8.1.1含義
擴(kuò)展運(yùn)算符是三個(gè)點(diǎn)(...),它如同rest參數(shù)的逆運(yùn)算,講一個(gè)數(shù)組轉(zhuǎn)化為用逗號(hào)分隔的參數(shù)序列。
console.log(...[1,2,3])
//1,2,3
該運(yùn)算符主要用于函數(shù)調(diào)用。
擴(kuò)展運(yùn)算符后面還可以放置表達(dá)式,
如果擴(kuò)展運(yùn)算符后面上第一個(gè)空數(shù)組,則不產(chǎn)生任何效果。
8.1.2
擴(kuò)展運(yùn)算符可以展開數(shù)組,所以就不需要使用apply方法將數(shù)組轉(zhuǎn)化為函數(shù)的參數(shù)。
es5的寫法。
function f(x,y,z){
}
var arge=[0,1,2,3]
f.apply(null,arge)
Es6寫法:
function f(x,y,z){
...
}
var arge =[0,1,2,3];
f(...arge);
push方法的參數(shù)不可以是數(shù)組,只好通過apply方法變通使用push方法,,可以直接將數(shù)組傳入push方法。
8.1.3擴(kuò)展運(yùn)算符的運(yùn)用
合并數(shù)組
es5
[1,2].concat(more);
es6
[1,2,...more]
es5 數(shù)組合并
var a=[1,2]
var b=[3,4]
a.concat(b);
es6
[...a,...b]
與解構(gòu)賦值結(jié)合
擴(kuò)展運(yùn)算符可以與解構(gòu)賦值結(jié)合起來,用于生成數(shù)組。
如果將擴(kuò)展運(yùn)算符用于數(shù)組賦值,則只能將其放在參數(shù)的最后一位,否則會(huì)報(bào)錯(cuò)。
函數(shù)的返回值
js的函數(shù)只哼返回一個(gè)值,如果需要多個(gè)返回值,只能返回?cái)?shù)組和 對(duì)象,擴(kuò)展運(yùn)算符提供了解決這中的一種變通方法。
擴(kuò)展運(yùn)算符還可以將字符串轉(zhuǎn)為真正的數(shù)組。
[...'hello'];
//['h','e','l','l','o']
8.2Array.from()
此方法可以將兩類對(duì)象轉(zhuǎn)為真正的數(shù)組,類似數(shù)組的對(duì)象和可遍歷的對(duì)象,包括es6新增的set和map
下面是一個(gè)類數(shù)組
let a ={
'0':'a',
'1':'b',
'2':'c',
length:3
}
es5寫法:
var arr.slice.call(a);//['a','b','c'];
es6寫法:
var arr=Array.from(a);//['a','b','c']
常見的類似數(shù)組的對(duì)象時(shí)DOM操作返回的NodeLIst集合,以及函數(shù)內(nèi)部的arguments對(duì)象,Array.from
都可以將他們轉(zhuǎn)為真正的數(shù)組、。
只有轉(zhuǎn)化為正真的數(shù)組,才能使用forEach方法。
如果參數(shù)是一個(gè)真正的數(shù)組,Array.from()返回的是一個(gè)一模一樣的新數(shù)組。
值得提醒的是。擴(kuò)展運(yùn)算符(...)也可以將某些數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)化為數(shù)組。
擴(kuò)展運(yùn)算符背后調(diào)用的是遍歷器接口(symbol.iterator),如果一個(gè)對(duì)象沒有部署改接口,Array.from方法就無法支持列斯數(shù)組的對(duì)象,
對(duì)于沒有支持該方法的瀏覽器,可以使用Array.protortype.slice代替。、
Array.from 還可以傳入第二個(gè)參數(shù) ,作用類似于數(shù)組的map方法,用來對(duì)每個(gè)元素進(jìn)行處理,將處理后的值放入返回的數(shù)組。
如果map函數(shù)里面用到了this 這個(gè)關(guān)鍵字,還可以傳入Array.from第三個(gè)參數(shù),用來綁定this。
Array.from()還可以將各種值轉(zhuǎn)為真正的數(shù)組,,并且提供map的功能,這意味著,只要有一個(gè)原始數(shù)據(jù)結(jié)構(gòu),就可以先對(duì)他的值進(jìn)行處理,然后轉(zhuǎn)成規(guī)范的數(shù)組結(jié)構(gòu)。
Array.from ()的另一個(gè)應(yīng)用是,將字符串轉(zhuǎn)為數(shù)組,返回字符串的長度,因?yàn)樗芴幚砀鞣NUnicode字符,可以避免js將大于\uFFFF的Unicode子字符作為2個(gè)字符的bug。
8.3Array.of()
用于將一組值轉(zhuǎn)換為數(shù)組。
Array.of(1,2,3)//[1.2.3]
Array.of(1)//[1]
Array.of(3).length//1
這個(gè)方法主要用來彌補(bǔ)數(shù)組構(gòu)造函數(shù)Array()的不足之處,因?yàn)閰?shù)的不同會(huì)導(dǎo)致Array()的行為有差異。
Array()//[]
Array(3)//[ , , ,]
Array(1,2,3)//[1,2,3]
只有當(dāng)參數(shù)不少于2個(gè)的時(shí)候,Array()才會(huì)返回由數(shù)組組成的新數(shù)組,參數(shù)只有1個(gè)的時(shí)候,實(shí)際上指的是數(shù)組的長度。
Array.of基本上可以取代Array()和new Array(),并且不存在由于參數(shù)不同而導(dǎo)致的重載,行為非常統(tǒng)一。
Array.of總是返回的是數(shù)值組成的數(shù)組,如果沒有參數(shù),就返回一個(gè)空的數(shù)組。
Array.of的方法可以用下面的方法實(shí)現(xiàn)
function ArrayOf(){
return [].slice .call(argumnets)
}
8.4數(shù)組實(shí)例的copyWithin()
會(huì)在當(dāng)前數(shù)組內(nèi)將指定的位置的成員復(fù)制到其他的位置,(會(huì)覆蓋原有成員),然后返回當(dāng)前的數(shù)組,就是說,這個(gè)方法會(huì)修改當(dāng)前數(shù)組。
Array.prototype.copyWithin(target,start=0,end=this.length);
接受3個(gè) 參數(shù)
target:必選。從該位置開始替換數(shù)據(jù)
start:可選:從該位置讀取數(shù)據(jù),默認(rèn)是0,如果為負(fù)數(shù),表示倒數(shù)。
end:可選:到該位置前停止讀取書庫,默認(rèn)等于數(shù)組長度,如果為負(fù)值,表示倒數(shù)。這3 個(gè)參數(shù)都應(yīng)該是數(shù)值,如果不是的話,會(huì)自動(dòng)轉(zhuǎn)為數(shù)值。
[1,2,3,4,5].copyWithin(0,3)//[4,5,3,4,5]
上面的意思是將從3號(hào)位置直到數(shù)組結(jié)束的成員(4,5)復(fù)制到從0號(hào)位置開始的位置,結(jié)果覆蓋了原來的1和2.
8.5數(shù)組實(shí)例的find()和finindex()
find方法適用于找出處第一個(gè)復(fù)合條件的數(shù)組成員,他的參數(shù)是一個(gè)回調(diào)函數(shù),所有數(shù)組成員依次執(zhí)行該回調(diào)函數(shù),直到找到各一個(gè)返回值為true的成員,然后返回該成員,如果沒有復(fù)合條件的成員,返回的則是undefined。
find回調(diào)函數(shù)可以接受3個(gè)參數(shù),依次為當(dāng)前的值,當(dāng)前的位置和原數(shù)組。
數(shù)組findindex方法的與find方法非常類似,返回第一個(gè)符合條件的數(shù)組成員的位置,如果所有成員都不符合條件,則返回-1.
這兩個(gè)方法都可以接受第二個(gè)參數(shù),用來綁定回調(diào)函數(shù)的this對(duì)象。另外,這兩方法艘可以發(fā)現(xiàn)NaN,彌補(bǔ)了數(shù)組的indexOf的不足之處。
8.6數(shù)組實(shí)例的fill()
此方法用于空數(shù)組的初始化時(shí)非常好用。數(shù)組中的所有元素都會(huì)被前部抹去。
用于給定值填充一個(gè)數(shù)組。
['a','b','c'].fill(7)//[7,7,7]
fill方法還可以接受第二個(gè)參數(shù)和第三個(gè)參數(shù),用于指定填充的起始位置和結(jié)束位置。 結(jié)束位置不包括自己
8.7數(shù)組實(shí)例的entries()/keys()和values();
es6新增的3個(gè)方法,用于遍歷數(shù)組,他們都返回一個(gè)遍歷器的對(duì)象,for...of循環(huán),keys()是對(duì)鍵命的遍歷,values()是對(duì)鍵值的遍歷,entries()是對(duì)鍵值對(duì)的遍歷。
如果不使用for...of循環(huán),可以使用遍歷器對(duì)象的next方法進(jìn)行遍歷。
8.8數(shù)組實(shí)例的includes()
Array.prototype.includes返回的是一個(gè)布爾值,表示某個(gè)數(shù)組是否包含給定的值,與字符串的includes方法類似,es6將其引入進(jìn)來,
該方法的第二個(gè)參數(shù)表示搜索的起始位置,默認(rèn)是0,如果第二個(gè)參數(shù)為負(fù)數(shù),表示倒數(shù)的位置,如果他大于數(shù)組長度,則會(huì)重置從0開始。
沒有此方法之前,我們用indexof方法檢查是否包含某個(gè)值,
indexOf的缺點(diǎn)是不夠語義,其含義找到參數(shù)某個(gè)值得時(shí)候的第一個(gè)位置,要比較是否等于-1,二是內(nèi)部使用嚴(yán)格相等進(jìn)行判斷,會(huì)導(dǎo)致對(duì)NaN的誤判、
[NaN].indexOf(NaN)//-1.