1分瘦、數組的解構賦值
1.1液荸、基本用法
ES6 允許按照一定模式瞻佛,從數組和對象中提取值,對變量進行賦值娇钱,這被稱為解構(Destructuring)伤柄。
很久很久以前,我們?yōu)檫@里賦值文搂,只能直接指定值适刀。
let a = "x";
let b = "x";
let c = "b";
現(xiàn)在,用ES6煤蹭,我們可以寫成:
let [a, b, c] = ["x", "x", "b"];
使用嵌套數組進行結構例子笔喉。
let [a, ...b] = [1, 2, 3, 4];
// 輸出
a // 1
b // [2, 3, 4]
解構賦值
let [x, y, ...z] = ["x"];
x // "x"
y // undefined
z // []
解構賦值
如果解構不成功,變量的值就等于undefined
let [x] = [];
let [a, b] = [1];
解構賦值
1.2硝皂、默認值
解構賦值允許指定默認值常挚。
let [a = true] = [];
let [x, y = "b"] = ["a", "diudiudiu"];
let [o, p = "hehe'] = ["haha", undefined];
注意,ES6 內部使用嚴格相等運算符(===)稽物,判斷一個位置是否有值奄毡。所以,如果一個數組成員不嚴格等于undefined
贝或,默認值是不會生效的吼过。
解構賦值
2锐秦、對象的解構賦值
let {a, b} = {a: "x", b: "y"};
對象的解構與數組有一個重要的不同。數組的元素是按次序排列的盗忱,變量的取值由它的位置決定酱床;而對象的屬性沒有次序,變量必須與屬性同名趟佃,才能取到正確的值斤葱。
對象解構賦值
如果變量名與屬性名不一致,必須寫成下面這樣揖闸。
let {a: c} = {a: "x", b: "y"};
c // x
let o = {first: "x", last: "b"};
let {first: f, last: l} = o;
對象解構賦值
這實際上說明,對象的解構賦值是下面形式的簡寫料身。
let { foo: foo, bar: bar } = { foo: "x", bar: "b" };
也就是說汤纸,對象的解構賦值的內部機制,是先找到同名屬性芹血,然后再賦給對應的變量贮泞。真正被賦值的是后者,而不是前者幔烛。
let {a: c} = {a: "x", b: "y"};
上面代碼中啃擦,a
是匹配的模式,c
才是變量饿悬。真正被賦值的是變量c
令蛉,而不是模式a
。
對象解構賦值
對象的解構也可以指定默認值狡恬。
let {a: b = 1} = {a: 0};
let {x: y = 3} = {x: 5};
對象解構賦值
默認值生效的條件是珠叔,對象的屬性值嚴格等于undefined。
如果解構不成功弟劲,變量的值就等于undefined
let {a} = {b: "c"};
a // undefined
由于數組本質是特殊的對象祷安,因此可以對數組進行對象屬性的解構。
let arr = [1, 2, 3];
let {0: first, [arr.length - 1]: last} = arr;
first // 1
last // 3
對象解構賦值
數組arr
的0
鍵對應的值是1
兔乞,[arr.length - 1]
就是2
鍵汇鞭,對應的值是3
。
3庸追、字符串的解構賦值
字符串也可以解構賦值霍骄。這是因為此時,字符串被轉換成了一個類似數組的對象锚国。
let [a, b, c] = "xxb";
字符串解構賦值
類似數組的對象都有一個length屬性腕巡,因此還可以對這個屬性解構賦值。
let {length: len} = "xxb666";
字符串解構賦值