解構賦值的意思是指:按照一定的模式從數(shù)組和對象中提取值迁央,將提取的值對變量進行賦值爬坑。
數(shù)組的解構模式:
1:按照等號兩側的數(shù)組對應的位置進行取值賦值呻澜,
1.1:如果等號兩側的數(shù)組結構和嵌套結構相同递礼,則可以成功解構
1.2:如果等號兩個的數(shù)組解構或嵌套解構不同,則解構不成功羹幸,解構不成功則對應位置的變量就賦值為undefined,數(shù)組(左).length > 數(shù)組(右).length
1.3:如果等號左側的模式只匹配到一部分的等號右側的數(shù)組脊髓,則可以成功解構,數(shù)組(左).length < 數(shù)組(右).length
1.4:如果右側不是數(shù)組栅受,將會報錯
1.5:set等具有Iterator接口的結構都可以進行解構
2:解構的同時可以賦值默認值
let [foo = true] = []//foo = true
默認值生效規(guī)則:
2.1:使用嚴格相等運算符(===)将硝,判斷一個位置是否有值恭朗,只有當?shù)忍栍覀葦?shù)組的一個成員嚴格等于undefined,默認值才會生效依疼。如果一個數(shù)組成員是null痰腮,默認值不會生效,因為null 不嚴格等于undefined律罢。
let [foo = 1] = [null]//foo = null
2.2:如果默認值是一個表達式膀值,那么這個表達式是惰性求值,即只有在用到的時候误辑,才會求值
function f(){
console.log('111')
}
let [x=f()] = [1]//x = 1
let [x=f()]=[]//x=f()
2.3:默認值可以引用解構賦值的其他變量沧踏,但該變量必須已經(jīng)聲明,否則會報錯
let [x=1,y=x] = [];//x=1,y=2
let [x=y,y=1] = [];//ReferenceError:y is not defined
對象的解構賦值
1.1:對象的解構模式不同于數(shù)組巾钉,數(shù)組按照元素次序翘狱,對象沒有次序,但變量必須與對象屬性同名砰苍,才能取到正確的值
1.2:當代碼中使用的變量名和對象解構的屬性名不同時潦匈,可以進行轉義:
let {foo:baz} = {foo:'aaa',bar:'bbb'};//baz = 'aaa';baz是自己定義的變量名师骗,foo是對象的屬性名,此處是匹配的模式,這樣就可以在代碼中還使用變量baz獲取對象中foo中的值,真正賦值的是變量baz,而模式foo并沒有被賦值
1.3:同數(shù)組一樣辟癌,解構也可以用于嵌套結構的對象;
對象嵌套結構的解構需要注意:
let obj = {
p:[
'Hello',
{y:'World'}
]
};
let {p:[x,{y}]} = obj//此時p是模式黍少,不會真正被賦值,被賦值的只有x,y
let {p,p:[x,{y}]} = obj//這種才能解構出p
1.4:解構賦值時子對象所在的父屬性不存在厂置,將會報錯菩掏,相當于對undefined取.xxx智绸,當然會報錯
1.5:對象解構賦值可以取到繼承的屬性
2:解構時賦值默認值
2.1:默認值生效的條件時對象屬性嚴格等于undefined
2.2:已經(jīng)聲明的變量再進行解構會報錯;js引擎會將{}理解為代碼塊访忿,從而發(fā)生語法錯誤,只有不將大括號寫在行首海铆,避免js將其解釋為代碼塊迹恐,才能解決問題。
let x;
({x} = {x:1})
2.3:數(shù)組也可以解構成對象屬性
let arr = [1,2,3]
let {0:first,[arr.length-1]:last} = arr//此時first,last分別被賦值到arr中的1卧斟,3
3:字符串的解構賦值
字符串被轉換成一個類似數(shù)組的對象殴边。
3.1:解構字符串內容
let [a,b,c,d,e] = 'Hello'//a='H',b='e',c='l',d='l',e='o'
3.2:解構字符串長度
let {length :len} = 'hello'//len=5
4:數(shù)值和布爾值的解構賦值
將數(shù)值和布爾值先轉為對象
模式:只要等號右側的值不是對象或數(shù)組憎茂,就先將其轉換為對象,由于undefined和null無法轉為對象锤岸,所以對它們進行解構賦值都會報錯竖幔。
5:函數(shù)的參數(shù)進行解構賦值
*參數(shù)賦值分給‘函數(shù)參數(shù)’賦默認值 和 給給‘解構參數(shù)’賦默認值
5.1:給解構參數(shù)賦默認值:
function move({x=0,y=0}={}){//函數(shù)的參數(shù)是一個對象,對象解構的參數(shù)x能耻,y,給解構的參數(shù)x,y賦值默認值0
return [x,y]
}
給函數(shù)參數(shù)賦值默認值
function move({x,y} = {x:0,y:0}){//賦值一個默認的參數(shù):{x:0,y:0}當函數(shù)入?yún)榭諘r赏枚,即為undefined時,才會將默認參數(shù)解構賦值給x,y
return [x,y]
}
6:解構賦值的用途:
合理使用解構賦值可以使代碼簡潔清晰
6.1:交換變量的值
let x=1;
let y=2;
[x,y]=[y,x]//x=2,y=1
6.2:從函數(shù)返回多個值
原本函數(shù)只能返回一個值
現(xiàn)在函數(shù)可以返回一個數(shù)組或是對象晓猛,然后通過解構賦值取出更多的值來
6.3:函數(shù)參數(shù)的定義
可以通過解構饿幅,直接定義函數(shù)體中使用的參數(shù)
6.4:提取JSON數(shù)據(jù)
解構賦值對提取JSON對象中的數(shù)據(jù),尤其有用
6.5:函數(shù)參數(shù)的默認值***
給函數(shù)參數(shù)賦值默認值戒职,可以減少寫保底參數(shù)
let foo = config.foo || 'xxx'//不用再像這樣寫保底參數(shù)
function test(foo='xxx'){
conosle.log(foo)
}
test('kkk')//'kkk'
test()//'xxx',輸出保底'xxx'
6.6:遍歷Map結構
使用for...of循環(huán)遍歷栗恩,通過解構獲取鍵名和鍵值非常方便
6.7:輸入模塊的指定方法
根據(jù)需要使用加載的模塊,指定輸入哪些方法
const {SourceMapConsumer ,SourceNode} = require('source-map')