步遙——解構賦值

解構賦值的意思是指:按照一定的模式從數(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')
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末洪燥,一起剝皮案震驚了整個濱河市磕秤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌捧韵,老刑警劉巖市咆,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異再来,居然都是意外死亡蒙兰,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門芒篷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來搜变,“玉大人,你說我怎么就攤上這事针炉∧铀” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵篡帕,是天一觀的道長殖侵。 經(jīng)常有香客問我,道長镰烧,這世上最難降的妖魔是什么拢军? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮拌滋,結果婚禮上,老公的妹妹穿的比我還像新娘猜谚。我一直安慰自己败砂,他們只是感情好赌渣,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布坚芜。 她就那樣靜靜地躺著斜姥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪铸敏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天闪水,我揣著相機與錄音球榆,去河邊找鬼禁筏。 笑死,一個胖子當著我的面吹牛篱昔,可吹牛的內容都是我干的旱爆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼脆烟,長吁一口氣:“原來是場噩夢啊……” “哼房待!你這毒婦竟也來了?” 一聲冷哼從身側響起拜鹤,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤敏簿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后惯裕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡撑刺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年够傍,在試婚紗的時候發(fā)現(xiàn)自己被綠了冕屯。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片市殷。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖搞挣,靈堂內的尸體忽然破棺而出音羞,到底是詐尸還是另有隱情,我是刑警寧澤嗅绰,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布窘面,位于F島的核電站,受9級特大地震影響肌括,放射性物質發(fā)生泄漏。R本人自食惡果不足惜谍夭,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一紧索、第九天 我趴在偏房一處隱蔽的房頂上張望菜谣。 院中可真熱鬧晚缩,春花似錦媳危、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至椎侠,卻和暖如春措拇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背丐吓。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工券犁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人粘衬。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓稚新,卻偏偏與公主長得像,于是被迫代替她去往敵國和親褂删。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內容