1.解構指派可以輕松擷取對象或者數組中的資料
var jsonData = {
data: "111",
data2: ["test","test2"],
};
json中的資料就被輕松擷取;
2.解構複制可以交換變量
var a=1,b=2,c=3,d=4;
[a,b,c,d]=[d,c,b,a];
console.log(a,b,c,d);
結果: a=4,b=3,c=2,d=1
指派的過程需要保證兩邊的資料格式比對
[a,b,c,d]=[d,c,b,];
d的值将為underfinded
3.對象的解構指派
let {obj, obj2 } = { obj: "666", obj2: "888" };
console.log(obj,obj2)
結果,666,888
數組解構
讓我們一起先來看數組解構的基本用法:
let [a, b, c] = [1, 2, 3] // a=1, b=2, c=3
let [d, [e], f] = [1, [2], 3] // 嵌套數組解構 d=1, e=2, f=3
let [g, ...h] = [1, 2, 3] // 數組拆分 g=1, h=[2, 3]
let [i,,j] = [1, 2, 3] // 不連續解構 i=1, j=3
let [k,l] = [1, 2, 3] // 不完全解構 k=1, l=2
對象解構
接下來再讓我們一起看看對象解構的基本用法:
let {a, b} = {a: 'aaaa', b: 'bbbb'} // a='aaaa' b='bbbb'
let obj = {d: 'aaaa', e: {f: 'bbbb'}}
let {d, e:{f}} = obj // 嵌套解構 d='aaaa' f='bbbb'
let g;
(g = {g: 'aaaa'}) // 以聲明變量解構 g='aaaa'
let [h, i, j, k] = 'nice' // 字元串解構 h='n' i='i' j='c' k='e'
使用場景
1.變量指派
我們先來看最基本的使用場景:變量指派,先來看我們在平時開發中是怎麼使用es5對變量指派的:
var data = {userName: 'aaaa', password: 123456}
var userName = data.userName
var password = data.password
console.log(userName)
console.log(password)
var data1 = ['aaaa', 123456]
var userName1 = data1[0]
var password1 = data1[1]
console.log(userName1)
console.log(password1)
上面兩個例子是最簡單的例子,用傳統es5變量指派,然後調用,這麼寫的問題就是顯得代碼啰嗦,明明一行可以搞定的事情非要用三行代碼,來看看解構指派是怎麼幹的:
const {userName, password} = {userName: 'aaaa', password: 123456}
console.log(userName)
console.log(password)
const [userName1, password1] = ['aaaa', 123456]
console.log(userName1)
console.log(password1)
相對于es5的文法是不是更加簡單明了,在資料量越大用解構指派的優勢越明顯
2.函數參數的定義
一般我們在定義函數的時候,如果函數有多個參數時,在es5文法中函數調用時參數必須一一對應,否則就會出現指派錯誤的情況,來看一個例子:
function personInfo(name, age, address, gender) {
console.log(name, age, address, gender)
}
personInfo('william', 18, 'changsha', 'man')
上面這個例子在對使用者資訊的時候需要傳遞四個參數,且需要一一對應,這樣就會極易出現參數順序傳錯的情況,進而導緻bug,接下來來看es6解構指派是怎麼解決這個問題的:
function personInfo({name, age, address, gender}) {
console.log(name, age, address, gender)
}
personInfo({gender: 'man', address: 'changsha', name: 'william', age: 18})
這麼寫我們隻需要知道要傳什麼參數就行來,不需要知道參數的順序也沒問題
3.交換變量的值
在es5中我們需要交換兩個變量的值需要借助臨時變量的幫助,來看一個例子:
var a=1, b=2, c
c = a
a = b
b = c
console.log(a, b)
來看es6怎麼實作:
let a=1, b=2;
[b, a] = [a, b]
console.log(a, b)
是不是比es5的寫法更加友善呢?
4.函數的預設參數
在日常開發中,經常會有這種情況:函數的參數需要預設值,如果沒有預設值在使用的時候就會報錯,來看es5中是怎麼做的:
function saveInfo(name, age, address, gender) {
name = name || 'william'
age = age || 18
address = address || 'changsha'
gender = gender || 'man'
console.log(name, age, address, gender)
}
saveInfo()
在函數離 main先對參數做一個預設值指派,然後再使用避免使用的過程中報錯,再來看es6中的使用的方法:
function saveInfo({name= 'william', age= 18, address= 'changsha', gender= 'man'} = {}) {
console.log(name, age, address, gender)
}
saveInfo()
在函數定義的時候就定義了預設參數,這樣就免了後面給參數指派預設值的過程,是不是看起來簡單多了
5.提取 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]
6.周遊 Map 結構
任何部署了 Iterator 接口的對象,都可以用for...of循環周遊。Map 結構原生支援 Iterator 接口,配合變量的解構指派,擷取鍵名和鍵值就非常友善。
const map = new Map();
map.set('first', 'hello');
map.set('second', 'world');
for (let [key, value] of map) {
console.log(key + " is " + value);
}
// first is hello
// second is world
// 擷取鍵名
for (let [key] of map) {
// ...
}
// 擷取鍵值
for (let [,value] of map) {
// ...
}
7.輸入子產品的指定方法
const { SourceMapConsumer, SourceNode } = require("source-map");