ES6:變數的解構賦值

weixin_34107955發表於2017-04-14

1、陣列的解構賦值

1.1、基本用法

ES6 允許按照一定模式,從陣列和物件中提取值,對變數進行賦值,這被稱為解構(Destructuring)。
很久很久以前,我們為這裡賦值,只能直接指定值。

let a = "x";
let b = "x";
let c = "b";

現在,用ES6,我們可以寫成:

let [a, b, c] = ["x", "x", "b"];

使用巢狀陣列進行結構例子。

let [a, ...b] = [1, 2, 3, 4];
// 輸出
a // 1
b // [2, 3, 4]
4481527-d14bcb7cf2c74a1b.png
解構賦值
let [x, y, ...z] = ["x"];
x // "x"
y // undefined
z // []
4481527-a1b39402abac1e27.png
解構賦值

如果解構不成功,變數的值就等於undefined

let [x] = [];
let [a, b] = [1];
4481527-809378255998f4ca.png
解構賦值

1.2、預設值

解構賦值允許指定預設值。

let [a = true] = [];
let [x, y = "b"] = ["a", "diudiudiu"];
let [o, p = "hehe'] = ["haha", undefined];

注意,ES6 內部使用嚴格相等運算子(===),判斷一個位置是否有值。所以,如果一個陣列成員不嚴格等於undefined,預設值是不會生效的。

4481527-bf09cd0808e2251c.png
解構賦值

2、物件的解構賦值

let {a, b} = {a: "x", b: "y"};

物件的解構與陣列有一個重要的不同。陣列的元素是按次序排列的,變數的取值由它的位置決定;而物件的屬性沒有次序,變數必須與屬性同名,才能取到正確的值。


4481527-8de51ac86ecc510b.png
物件解構賦值

如果變數名與屬性名不一致,必須寫成下面這樣。

let {a: c} = {a: "x", b: "y"};
c // x

let o = {first: "x", last: "b"};
let {first: f, last: l} = o;
4481527-adc0f1cfa2c7d83e.png
物件解構賦值

這實際上說明,物件的解構賦值是下面形式的簡寫。

let { foo: foo, bar: bar } = { foo: "x", bar: "b" };

也就是說,物件的解構賦值的內部機制,是先找到同名屬性,然後再賦給對應的變數。真正被賦值的是後者,而不是前者。

let {a: c} = {a: "x", b: "y"};

上面程式碼中,a是匹配的模式,c才是變數。真正被賦值的是變數c,而不是模式a

4481527-b74a34769a406a44.png
物件解構賦值

物件的解構也可以指定預設值。

let {a: b = 1} = {a: 0};
let {x: y = 3} = {x: 5};
4481527-b86b8f1bb8467216.png
物件解構賦值

預設值生效的條件是,物件的屬性值嚴格等於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
4481527-89bd1cb1da48b4ae.png
物件解構賦值

陣列arr0鍵對應的值是1[arr.length - 1]就是2鍵,對應的值是3

3、字串的解構賦值

字串也可以解構賦值。這是因為此時,字串被轉換成了一個類似陣列的物件。

let [a, b, c] = "xxb";
4481527-2d0ba361b19b73b1.png
字串解構賦值

類似陣列的物件都有一個length屬性,因此還可以對這個屬性解構賦值。

let {length: len} = "xxb666";
4481527-5ffaf6cb3e982f98.png
字串解構賦值

相關文章