ES6基礎之解構賦值(destructuring assignment)
我們經??梢栽谄渌幊陶Z言(如GO語言)中看到多返回值這種特性,因為在很多實際場景中,函數的返回值中,函數的返回值并不只有一個單一的值。ES6之前,并沒有可以直接使用語法來實現多返回值的特性。ES6終于出現了解構賦值的語法糖來解決此類問題。
解構賦值是一種表達式,允許您使用數組或對象,將可迭代對象的值或屬性分配給變量。解構賦值能讓我們用更簡短的語法進行多個變量的賦值,大大的減少了代碼量。解構表達式有兩種:array和object。
今天的文章筆者將從以下方面進行介紹:
- 使用數組表達式解構賦值
- 常規(guī)用法
- 忽略數組中的某些值
- 使用展開語法
- 默認參數值
- 嵌套數組解構
- 作為函數參數
- 使用對象表達式解構賦值
- 常規(guī)用法
- 默認參數值
- 嵌套對象
- 作為函數參數
- 其他
- 解構對象的方法
- 獲取字符串長度
- 拆分字符串
- 交換變量
- 遍歷Map結構
- 加載指定模塊的方法
- 常用場景介紹
使用數組表達式解構賦值
常規(guī)用法
如何將一個數組的值,賦值給多個變量?數組解構語法能讓我們快速的迭代數組的元素,并賦值給多個變量。
E6之前,我們可以這種形式將數組的內容賦值給多個變量:
var myArray = [1, 2, 3]; var a = myArray[0]; var b = myArray[1]; var c = myArray[2];
ES6后,我們可以通過數組解構語法,在一行語句里完成上述操作。
let myArray = [1, 2, 3]; let a, b, c; [a, b, c] = myArray; //array destructuring assignment syntax
上述代碼中,[a, b, c]就是解構表達式。在數組解構語句的左側就是需要進行賦值的多個變量,等號右側則是我們需要分配的值。
我們還可以讓上述代碼更短,你還可以這么寫,代碼如下:
let [a, b, c] = [1, 2, 3];
我們在同一行語句中創(chuàng)建變量,而不是分別創(chuàng)建。是不是更清爽。
如果左邊的數值少于右邊數組的項數,左邊變量的值只會和右邊數組的內容一一對應,多于的內容將會忽略。
忽略數組中某些值
如果只有兩個變量,我們數組內容有三項,我們想跳過數組中的第二項,我們如何使用數組解構賦值呢?代碼如下:
let [a, , b] = [1, 2, 3]; console.log(a); console.log(b);
上述代碼我們使用, ,忽略數組中的第二項,建議中間有空格,方便我們閱讀。
使用展開語法
上篇文章 《【ES6基礎】展開語法(Spread syntax)》 ,筆者介紹了展開語法的幾個應用場景,由于上篇文章沒介紹解構賦值,所以在這里給大家介紹展開語法在解構賦值的應用。如下段代碼所示:
let [a, ...b] = [1, 2, 3, 4, 5, 6]; console.log(a); console.log(Array.isArray(b)); console.log(b);”
上述代碼則會輸出:
1
true
2,3,4,5,6
上述代碼,你可以看到b變量被解構賦值成數組,這里...就是我們上篇文章提到的剩余參數場景的運用。
如果想跳過數組中的部分值,我們可以這么做,如下段代碼所示:
let [a, , ,...b] = [1, 2, 3, 4, 5, 6]; console.log(a); console.log(b);
上述代碼則會輸出:
1
4,5,6
這段代碼我們跳過了數組的第2項和第3項。
默認參數值
筆者在 《【ES6基礎】默認參數值》 給大家介紹了如何使用默認參數值,在解構賦值中,我們如何設置變量的默認值呢,如下段代碼所示:
let [a, b, c = 3] = [1, 2]; console.log(c); //Output "3”
嵌套數組
我們還可以從多維數組中提取值并分配給變量,如下段代碼所示:
let [a, b, [c, d]] = [1, 2, [3, 4]];
作為函數參數
我們還可以使用數組解構表達式作為函數參數來提取可迭代數組的值,作為參數傳遞給函數參數,如下段代碼所示:
function myFunction([a, b, c = 3]) {
console.log(a, b, c); //Output "1 2 3"
}
myFunction([1, 2]);
筆者在《【ES6基礎】默認參數值》 提及到我們可以傳遞undefined,指定某個具體的參數使用默認值,我們可以使用結構賦值為相關變量提供一組默認值,并傳入undefined,如下段代碼所示:
function myFunction([a, b, c = 3] = [1, 2, 3]) {
console.log(a, b, c); //Output "1 2 3"
}
myFunction(undefined);
在這里,我們將undefined作為參數傳遞,因此使用默認數組[1,2,3]進行提取賦值。
使用對象表達式解構賦值
常規(guī)用法
對象解構賦值將對象屬性的值賦給多個變量。ES6之前我們可以這樣把對象的屬性賦值給多個變量,如下段代碼所示:
var object = {name : "John", age : 23};
var name = object.name;
var age = object.age;
在ES6里,我們可以使用對象解構表達式,在單行里給多個變量賦值,如下段代碼所示:
let object = {name : "John", age : 23};
let name, age;
({name, age} = object); //object destructuring assignment syntax
對象解構賦值的左側為解構賦值表達式,右側為對應要分配賦值的對象。解構語句的兩邊千萬 不要遺漏左右括號() ,否則會報錯。
還有一點需要格外注意,解構對象 變量的名稱一定要和右邊對象的屬性名稱保持一致 ,否則會提示變量的值為undefined。如果你想以其它的變量名進行命名,你可以這么做,如下段代碼所示:
let object = {name : "John", age : 23};
let x, y;
({name: x, age: y} = object);
上述代碼x,y為對應對象屬性的值John,23。如果你輸出name或age,編譯器則會提示ReferenceError: 變量 is not defined
我們可以讓代碼更短,如下段代碼所示:
let {name: x, age: y} = {name : "John", age : 23};
上述代碼由于聲明變量和解構賦值在同一行,因此對象解構語句兩邊無需左右括號()。
默認參數值
在解構對象針對未分配值的變量,我們可以為變量提供默認值,如下段代碼所示:
let {a, b, c = 3} = {a: "1", b: "2"};
console.log(c); //Output "3”
在解構對象時變量名支持表達式計算,如下段代碼所示:
let {["first"+"Name"]: x} = { firstName: "Eden" };
console.log(x); //Output "Eden”
嵌套對象
我們還可以從嵌套對象中提取屬性值,即對象中的對象。 如下段代碼所示:
let {name, otherInfo: {age}} = {name: "Eden", otherInfo: {age:23}};
console.log(name, age); //Eden 23
作為函數參數
就像數組解構賦值一樣,我們也可以使用對象解構賦值作為函數參數,如下段代碼所示:
function myFunction({name = 'Eden', age = 23, profession ="Designer"} = {}){
console.log(name, age, profession); // Outputs "John 23 Designer"
}
myFunction({name: "John", age: 23});
在這里,我們傳遞一個空對象作為默認參數值,如果將undefined作為函數參數傳遞,變量將使用默認值。
其他
解構對象的方法
比如結構Math對象的方法,如下段代碼所示:
let {floor,pow}=Math;//把Math里的方法提取出來變成一個變量
let a=1.1;
console.log(floor(a));//1
console.log(pow(2,3));//8
獲取字符串的長度
var {length}='lxy';
console.log(length);//3
拆分字符串
var [a,b,c,d]='前端達人'; console.log(a,b,c,d) // 輸出:前 端 達 人
交換變量
let x = 1; let y = 2; [x, y] = [y, x];
遍歷Map結構
var map = new Map();
map.set('first', 'hello');
map.set('second', 'world');
for (let [key, value] of map) {
console.log(key + " is " + value);
}
加載指定模塊的方法
const { SourceMapConsumer, SourceNode } = require("source-map");
常用場景介紹
比如我們經常與后端API接口做數據交互,我們需要處理返回的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]
小節(jié)
今天的內容有些多,想必大家對解構賦值有了全面的認識吧,使用解構賦值是不是很強大,大大簡化了我們的代碼量,雖然優(yōu)勢蠻多,但是增加對代碼的理解難度,我們只有在實踐中不斷的運用,來加深我們對解構賦值的認識。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

