相對es5的簡單的「=」賦值來講,es6增長了一種新的賦值模式——解構賦值,按照它的規則,能夠從數組和對象中提取值來對變量進行賦值,我的以爲方便了不少,可是這個模式有點噁心人,相比簡單的「=」賦值來講,也更要花時間來理解,今天咱們一塊兒學習一下這個新的賦值方法。es6
看一行代碼:數組
let [a,b,c] = [1,2,3];
這是一種最基本的數組解構賦值,等同於:學習
var a = 1; var b = 2; var c = 3;
至關於兩邊都是數組,它們的length相同,左邊放變量,右邊放值,一一對應,省了很多代碼es5
若是length不一樣的話,會有兩種狀況:spa
let [x, y] = [1, 2, 3]; //x=1 //y=2 let [a] = []; //a=undefined; let [a, b] = [1]; //a=1; //b=undefined;
第一種:左邊的length小於右邊的,叫作不徹底解構,變量均可以賦值成功,多餘的值就多餘了;code
第二種:左邊的length大於右邊的,未超出的部分會正常解構並賦值,超出的變量在右邊沒有匹配的值,則解構失敗,值定位undefined;對象
那若是兩邊的類型不一樣,舉個栗子:一邊是數組,另外一邊是非數組,則會報錯,借用阮大神的話:blog
// 報錯 let [foo] = 1; let [foo] = false; let [foo] = NaN; let [foo] = undefined; let [foo] = null; let [foo] = {}; //上面的語句都會報錯,由於等號右邊的值,要麼轉爲對象之後不具有 //Iterator 接口(前五個表達式),要麼自己就不具有 Iterator 接口(最後一 //個表達式)。
es6中還有默認值的概念,解構賦值也容許指定默認值:接口
let [foo = true] = []; foo // true let [x, y = 'b'] = ['a']; // x='a', y='b' let [x, y = 'b'] = ['a', undefined]; // x='a', y='b'
咱們能夠看到,兩邊數組的length並不一樣,也沒有賦值,但能夠正常輸出,是由於在聲明變量時,給了變量一個默認值,若沒有用其餘方式給該變量賦值的話,則使用默認值,es6判斷使用默認值的狀況是給出了該位置的值爲undefined(未給任何值的話默認是undefined)且必須「===」undefined,纔會使用默認值:class
let [x = 1] = [undefined]; x // 1 let [x = 1] = [null]; x // null
上面的代碼能夠這樣理解:
let x; if ([undefined][0] === undefined) { x = 1; } else { x = [undefined][0]; } let x; if ([null][0] === undefined) { x = 1; } else { x = [null][0]; }
而後在變量數量多的狀況下,能夠引用解構賦值的其餘變量,但該變量必須已經聲明,且有一個順序:後面的可使用前面的,反之不可:
let [x = 1, y = x] = []; // x=1; y=1 let [x = 1, y = x] = [2]; // x=2; y=2 let [x = 1, y = x] = [1, 2]; // x=1; y=2 let [x = y, y = 1] = []; // ReferenceError let [x = y, y = 1] = [2]; // x=2,y=1
今天就寫到這裏吧,數組的解構賦值也差很少了,但願能給你們一點幫助,之後我會邊學邊整理隨筆,你們一塊兒進步。(感謝阮一峯大神的經驗)