es6+最佳入門實踐(2)

2.解構賦值

2.1.什麼是解構賦值?

什麼是解構賦值?這裏的關鍵字還是賦值,這是說如何去賦值的問題,這裏說的解構可以理解爲解散重新構造,所以解構賦值可以理解爲解散重新構造後進行賦值,通常是左邊一種結構,右邊一種結構,左右的結構拆開來一一對應進行賦值,例如:

let a, b
[a, b] = [1, 2]
console.log(a, b)

這裏就相當於把1賦值給a,把2賦值給b,這樣的操作就叫做解構賦值,從本質上來說,結構解構賦值是一種匹配模式,只要等號兩邊的模式相同,那麼左邊的變量就可以被賦值給右邊對應的值

爲什麼要使用解構賦值?在沒有解構賦值的時候,多個賦值會比較麻煩,爲了書寫更加方便,加入解構賦值是非常有必要的,例如:沒有解構賦值的時候,交互兩個變量的值,我們是這樣做的

let a = 10;
let b = 20;
let temp = a;
a = b;
b = temp;

console.log(a, b);

有了解構賦值以後,我們的代碼可以這樣寫:


let a = 10;
let b = 20;
[a, b] = [b, a];
console.log(a, b);

2.2.數組的解構賦值

左右兩邊是數組這種結構,我們稱爲數組的解構賦值,這樣也是非常常用的一種形式

注意1: 解構不成功,值爲undefined

let [a, b] = [10]
console.log(a, b)  // 10, undefined

注意2: 解構的時候可以設置默認值

let [a, b=20] = [10]
console.log(a, b)  // 10 20

注意3: 值比變量多的情況可以使用"..."符號

let [a, b, ...rest] = [1, 2, 3, 4, 5, 6]
console.log(a,b,rest)

//rest元素必須放在最後,下面這種寫法會報錯
let [a, b, ...rest, c] = [1, 2, 3, 4, 5, 6]

2.3.對象的解構賦值

如果等號左右兩邊是對象的結構,我們稱之爲對象的解構賦值,也是非常常用的形式

let { a:a, b:b } = { a: 1, b: 2 }
console.log(a, b)

注意1: 對象的解構賦值和數組不同,數組的賦值是以位置爲對應關係進行賦值的,必須按順序來寫,而對象的賦值是以屬性名爲對應關係的,因此,不用考慮順序,其內部的機制就是,先找到同名的屬性,再把右邊的值賦值給左邊的變量

注意2: 如果左邊的({屬性名:變量名})屬性名和變量名一樣,那麼可以簡寫成下面的形式

// let { a:a, b:b } = { a: 1, b: 2 }
//上面這種寫法和下面的寫法是等價的
let {a, b} = {a:1,b:2}
console.log(a, b)

//如果屬性名和變量名是不同的,那必須寫完整,例如下面這種寫法

let {x:m,y:n} = {x: 1, y: 2}  
// 這裏的機制是 根據x的對應關係 把1賦值給m 根據y的對應關係,把2賦值給n

注意3: 對象的解構賦值也可以設置默認值


let {a, b=20} = {a: 1}
console.log(a, b) //1, 20

2.4.數組和對象解構賦值嵌套

// 數組的解構賦值嵌套
let [a, [b, c],d] = [1, [2, 3], 4]
console.log(a, b, c, d)

// 對象的解構賦值嵌套

let obj = {
  p: [
    'Hello',
    { y: 'World' }
  ]
};

let { p, p: [x, { y }] } = obj;
//p=['hello', {y: 'world'}] x='Hello' y = 'World'

2.5.解構賦值應用

1.變量交換

let a = 10;
let b = 20;
[a, b] = [b, a];
console.log(a, b);

2.函數返回多個值

function fn() {
  return [1, 2, 3];
}
let [a, b, c] =  fn();

3.參數定義

// 參數是一組有次序的值
function f([x, y, z]) { ... }
f([1, 2, 3]);

// 參數是一組無次序的值
function f({x, y, z}) { ... }
f({z: 3, y: 2, x: 1});

4.提取json數據

let jsonData = {
  id: 42,
  status: "OK",
  data: [867, 5309]
};

let { id, status, data: number } = jsonData;

console.log(id, status, number);
// 42, "OK", [867, 5309]

視頻教程地址:http://edu.nodeing.com/course/50

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章