ES6之變數的解構賦值

wade3po發表於2019-02-02

ES6 允許按照一定模式,從陣列和物件中提取值,對變數進行賦值,這被稱為解構。解構賦值在一些場景下還是很有用的。

陣列:

從陣列中提取值,按照對應位置,對變數賦值。“模式匹配”,只要等號兩邊的模式相同,左邊的變數就會被賦予對應的值。如果解構不成功,變數的值就等於undefined。不完全解構,即等號左邊的模式,只匹配一部分的等號右邊的陣列。這種情況下,解構依然可以成功。

let [a, [[b], c]] = [1, [[2], 3]];
console.log(a); // 1
console.log(b); // 2
console.log(c); // 3

let [ , , d] = [5, 6, 7];
console.log(d); // 7

let [e, , f] = [8, 9, 10];
console.log(e); // 8
console.log(f); // 10

let [g, ...h] = [1, 2, 3, 4];
console.log(g); // 1
console.log(h); // [2, 3, 4]

let [i, j, ...k] = [5];
console.log(i);// 5
console.log(j); // undefined
console.log(k); // []

let [l] = [];
let [m, n] = [6];
console.log(l);//undefined
console.log(m);//6
console.log(n);//undefined

let [x, y] = [1, 2, 3];
console.log(x); // 1
console.log(y); // 2
複製程式碼

物件:

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

let {a, b, c} = {a: "aaa", b:"bbb"};
console.log(a);//aaa
console.log(b);//bbb
console.log(c);//undefined
複製程式碼

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

let {fa: a, fb: b } = {fa: "aaa",fb: "bbb"};
console.log(a);//aaa
console.log(b);//bbb
console.log(fa);//Uncaught ReferenceError: fa is not defined
console.log(fb);//Uncaught ReferenceError: fb is not defined
複製程式碼

也就是說通過fa、fb找到對應的的同名屬性,然後把值賦給變數a、b,這是需要特別注意的點。如果是{a,b}等同於{a: a, b: b}

同樣的,可以巢狀解構:

let {
    a: [e], a: [{
        b: {
            c:[d]
        }
    }]
} = {
    a: [{
        b: {
            c: [0]
        }
    }]
};
console.log(d);//0
複製程式碼

巢狀解構在實際中一般不會使用,所以我們只要記住,左右兩邊解構一致,就可以解構賦值。

字串:

字串會被解析成陣列去解構:

let [a, b, c, d] = '123';
console.log(a);//1
console.log(b);//2
console.log(c);//3

console.log(d);//undefined


let {length: len} = 'hello';
console.log(len); // 5
複製程式碼

特別注意,字串能獲得字串長度解構。

數值、布林值、undefined、null也能夠解構,但是不推薦使用,這邊就不說了。

函式引數也支援解構:

function add([x, y]){
    return x + y;
}

console.log(add([1, 2]));; // 3
複製程式碼

預設值:

解構賦值允許設定預設值,也就是說右邊沒有對應上的時候,會取左邊設定的預設值。

let [a = 0, b = 1, c = 2] = [8, 8];
console.log(a);//8
console.log(b);//8
console.log(c);//2
複製程式碼

物件也一樣:

let {a: a, b: b, c: c = 6} = {a: 8, b: 8};
console.log(a);//8
console.log(b);//8
console.log(c);//6
複製程式碼

用途:

一個方法,比較重要的就是用途了。解構賦值在一些場景下非常有用

交換變數:

let [x, y] = [1, 2];
[x, y] = [y, x];
console.log(x);//2
console.log(y);//1
複製程式碼

函式返回值,也就是return、函式引數可以很方便的把資料對應起來,還可以設定預設值。

提取JSON:

比如我們呼叫介面返回了很多資料,我們需要一個一個賦值

let data = {
    have: 'new',
    old: 'old',
    free: [0, 1, 2, 3],
}


let have = data.new;
let old = data.old;
let free = data.free;

複製程式碼

使用解構的話: let {free, old, have} = data;

其實我們一直使用的import {}使用的也是解構。

歡迎關注Coding個人筆記 公眾號

相關文章