解構(gòu)賦值
解構(gòu)賦值說(shuō)白了就是一種模式匹配,等號(hào)左右兩邊對(duì)應(yīng)變量和值。解構(gòu)賦值可以是完全解構(gòu)賦值,即每個(gè)值與右邊一一對(duì)應(yīng),也可以是不完全解構(gòu)賦值,即只取等號(hào)右邊值的一部分。解構(gòu)賦值可以對(duì)變量取默認(rèn)值。
解構(gòu)賦值取默認(rèn)值的條件是,對(duì)應(yīng)值不全等于undefined,ES6全都是用 === 即全等來(lái)判定是否為對(duì)等
數(shù)組的解構(gòu)賦值
數(shù)組的解構(gòu)賦值比較簡(jiǎn)單,即[]兩邊匹配即可
let [x,y] = [1,2] // x =1,y=2
let [z,m=1] = [1] // x = 1,m=1
let [a,[b,c],d] = [1,[2,3],4] // a = 1,b=2,c=3,d=4
對(duì)象的解構(gòu)賦值
對(duì)象的解構(gòu)賦值是有模式的
let {foo,foo:{a},foo:{a:[x,y,z=4]}} = {foo:{a:[1,2]}}
// foo:{a:[1,2,3]}
// a:[1,2,3]
// x=1,y=2,z=4
每個(gè)逗號(hào)都是一個(gè)模式,變量的屬性值必須跟對(duì)象的屬性值相一致,否則無(wú)法成功為 undefined。
對(duì)象的解構(gòu)本質(zhì)上是下面的簡(jiǎn)寫
let {foo:foo,baz:baz} = {foo:1,baz:2}
// foo:1,baz:2
對(duì)于已經(jīng)聲明的變量進(jìn)行賦值解構(gòu),要注意花括號(hào)的方式,系統(tǒng)會(huì)把它當(dāng)作塊級(jí)作用域,所以我們要非匹配模式的部分增加括號(hào)。
let foo
{foo} = {foo:1}
// 報(bào)錯(cuò) Uncaught SyntaxError
let foo
({foo} = {foo:1})
// foo : 1
數(shù)組本質(zhì)是特殊的對(duì)象,所以可以這樣取值:
let arr = [1, 2, 3];
let {0 : first, [arr.length - 1] : last} = arr;
first // 1
last // 3
字符串的解構(gòu)
在字符串的解構(gòu)過程中,首先會(huì)把字符串轉(zhuǎn)變成數(shù)組,當(dāng)然,會(huì)有一個(gè)length屬性。
數(shù)值和布爾值
賦值解構(gòu)只要等號(hào)右邊不是數(shù)組跟對(duì)象,都會(huì)優(yōu)先轉(zhuǎn)換為對(duì)象
用途
交換變量的值
[x,y] = [y,x]
從函數(shù)返回多個(gè)值
函數(shù)參數(shù)的定義和默認(rèn)值
提取JSON的值
遍歷map解構(gòu)
指定模塊的輸出方法