簡單敘述ES6的簡單特性2
ES6 允許按照一定模式绑警,從數組和對象中提取值,對變量進行賦值芝加,這被稱為解構
es5 es6
let a = 1; let [a, b, c] = [1, 2, 3];
let b = 2;
let c = 3;
上面代碼表示,可以從數組中提取值射窒,按照對應位置藏杖,對變量賦值
本質上,這種寫法屬于“模式匹配”脉顿,只要等號兩邊的模式相同蝌麸,左邊的變量就會被賦予對應的值。下面是一些使用嵌套數組進行解構的例子艾疟。
let [foo, [[bar], baz]] = [1, [[2], 3]];
foo // 1
bar // 2
baz // 3
let [ , , third] = ["foo", "bar", "baz"];
third // "baz"
let [x, , y] = [1, 2, 3];
x // 1
y // 3
let [head, ...tail] = [1, 2, 3, 4];
head // 1
tail // [2, 3, 4]
let [x, y, ...z] = ['a'];
x // "a"
y // undefined
z // []
如果解構不成功来吩,變量的值就等于undefined。
另一種情況是不完全解構蔽莱,即等號左邊的模式弟疆,只匹配一部分的等號右邊的數組。這種情況下盗冷,解構依然可以成功怠苔。
let [x, y] = [1, 2, 3];
x // 1
y // 2
let [a, [b], d] = [1, [2, 3], 4];
a // 1
b // 2
d // 4
上面兩個例子,都屬于不完全解構仪糖,但是可以成功
如果等號的右邊不是數組(或者嚴格地說柑司,不是可遍歷的結構,參見《Iterator》一章)锅劝,那么將會報錯攒驰。
// 報錯
let [foo] = 1;
let [foo] = false;
let [foo] = NaN;
let [foo] = undefined;
let [foo] = null;
let [foo] = {};
對于 Set 結構,也可以使用數組的解構賦值
let [x, y, z] = new Set(['a', 'b', 'c']);
x // "a"
事實上故爵,只要某種數據結構具有 Iterator 接口玻粪,都可以采用數組形式的解構賦值
function* fibs() {
let a = 0;
let b = 1;
while (true) {
yield a;
[a, b] = [b, a + b];
}
}
let [first, second, third, fourth, fifth, sixth] = fibs();
sixth // 5