2018-07-05 (變量的解構(gòu)賦值)

變量的解構(gòu)賦值

從數(shù)組和對(duì)象中提取值靠汁,對(duì)變量進(jìn)行賦值蜂大,這被稱為解構(gòu)。


let [a,b,c] = [1,2,3];


可以從數(shù)組中提取值蝶怔,按照對(duì)應(yīng)位置奶浦,對(duì)變量賦值。

這種寫法屬于 “模式匹配”踢星,只要等號(hào)兩邊的模式相同澳叉,左邊的變量就會(huì)被 賦予 對(duì)應(yīng)的值。

下面是 一些 使用 嵌套數(shù)組進(jìn)行解構(gòu)的例子斩狱。


let [foo,[bar],baz] = [1,[2],3];

// foo  1, bar  2,baz  3;

let [ , ,third] = ['foo','bar','baz'];

// third   baz;

let [x, ,y] = [1,2,3];

//  x   1
//  y   3

let [head,...tail] = [1,2,3,4];
//   head  1 
//   tail   [2,3,4];

let [x,y,...z] = ['a'];

//   x   "a"
//   y    undefined
//   z    []


如果 解構(gòu)不成功耳高,變量值 等于 undefined。

···
let [foo] = [];
let [bar,foo] = [1];

···

上面 代碼 所踊,都屬于 解構(gòu) 不成功泌枪,foo 的 值 都會(huì) 等于 undefined。

另一種 情況 是 不完全解構(gòu)秕岛,即 等號(hào)左邊的模式碌燕,只匹配一部分的等號(hào)右邊的數(shù)組,這種情況下继薛,解構(gòu)依然可以成功修壕。

let [x,y] = [1,2,3];

//  x   1 
//  y   2


let [a,[b],d] = [1,[2,3],4];
//  a   1 
//  b   2 
//  d   4



上面 兩個(gè)例子,屬于 不完全解構(gòu)遏考,但是可以成功慈鸠。

如果等號(hào)右邊 不是數(shù)組,那么將會(huì)報(bào)錯(cuò)灌具。
(嚴(yán)格地說 青团, 不可遍歷的結(jié)構(gòu))

所以,等號(hào)兩邊的模式相同咖楣,才可以對(duì)其 賦值督笆。

布爾值

返回的是 true 和 false。

解構(gòu)賦值 的 規(guī)則是 诱贿, 只要等號(hào)右邊的值娃肿,不是對(duì)象或數(shù)組,就先將其轉(zhuǎn)為對(duì)象珠十。

由于料扰,undefined 和 null 無法 轉(zhuǎn)為 對(duì)象,所以焙蹭,對(duì)他們進(jìn)行解構(gòu)賦值晒杈,都會(huì)報(bào)錯(cuò)。


let  {prop : x} = undefined;  // TypeError;

let  {prop : y} = null;     //   TypeError;

函數(shù)參數(shù)的解構(gòu)賦值壳嚎。

函數(shù)的參數(shù)桐智,也可以使用,解構(gòu)賦值烟馅。

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

}

add([1,2]);  // 3

函數(shù)add的參數(shù)表面上是一個(gè)數(shù)組说庭,但在傳入?yún)?shù)的那一刻,數(shù)組參數(shù)就被解構(gòu)成變量x和y郑趁。對(duì)于函數(shù)內(nèi)部的代碼來說刊驴,它們能感受到的參數(shù)就是 x 和 y 。

    [ [1,2],[3,4] ].map( ([a,b]) => a+b );

    //   [3,7];

首先寡润,這是個(gè)捆憎,箭頭函數(shù), 傳參傳的是數(shù)組梭纹,a躲惰,b 。
箭頭函數(shù)变抽,如果础拨,不寫 {} 大括號(hào),直接返回绍载,
如果不需要直接返回的話诡宗,寫上{},

然后击儡,用 map 這個(gè) 方法塔沃,循環(huán),解構(gòu)數(shù)組阳谍,
先算蛀柴,二維數(shù)組的 求(1,2) 返回 3 ,
再算边坤,(3,4) 名扛,返回 7 。

函數(shù)的解構(gòu)賦值茧痒,可以肮韧,使用默認(rèn)值。

  function move( {x = 0,y = 0} = {} ){

      return  [x,y];

}

move({x : 3,y : 8});    //   [3,8]
move({x : 3});      //    [3,0]
move({});          //       [0,0]
move();            //       [0,0]

上面的代碼中旺订,函數(shù) move 的 參數(shù) 是一個(gè) 對(duì)象弄企,通過對(duì)這個(gè)對(duì)象進(jìn)行解構(gòu),得到變量x 和 y
的 值区拳。如果 解析 失敗拘领, x 和 y 等于 默認(rèn)值。

   
   function move({x,y} = { x:0,y:0 } ){

   return [x,y]

}
   move({x : 3,y : 8})   //   [3,8]
   move({x : 3});     //   [3,undefined]
   move({});           //   [undefined,undefined]
   move();             //  [0,0];

上面代碼是為 函數(shù) move 的 參數(shù) 指定默認(rèn)值樱调, 而不是為變量x 和 y 指定默認(rèn)值约素,所以會(huì)得到與前一種届良,寫法不同的結(jié)果。

= 左邊是變量圣猎,右邊是 參數(shù)士葫;

undefined 就會(huì),觸發(fā)函數(shù)參數(shù)送悔,的默認(rèn)值慢显。

   [1,undefined,3].map((x = 'yes') => x);
   //  [1,'yes',3] 

圓括號(hào)問題

解構(gòu)賦值雖然很方便,但是解析起來并不容易欠啤。對(duì)于編譯器來說荚藻,一個(gè)式子到底是模式,還是表達(dá)式洁段,沒有辦法從一開始就知道应狱,必須解析到(或解析不到)等號(hào)才能知道。

由此帶來的問題是祠丝,如果模式中出現(xiàn)圓括號(hào)怎么處理侦香。ES6 的規(guī)則是,只要有可能導(dǎo)致解構(gòu)的歧義纽疟,就不得使用圓括號(hào)罐韩。

但是,這條規(guī)則實(shí)際上不那么容易辨別污朽,處理起來相當(dāng)麻煩散吵。因此,建議只要有可能蟆肆,就不要在模式中放置圓括號(hào)矾睦。

不能 使用 圓括號(hào) 的 情況。

  1. 變量 聲明 語句炎功。
   //  全部報(bào)錯(cuò)
   
   let [(a)] = [1];

 let {x: (c)} = {};
 let ({x: c}) = {};
 let {(x: c)} = {};
 let {(x): c} = {};

 let { o: ({ p: p }) } = { o: { p: 2 } };


上面 6 個(gè)語句都會(huì)報(bào)錯(cuò)枚冗,因?yàn)樗鼈兌际亲兞柯暶髡Z句,模式不能使用圓括號(hào)蛇损。

  1. 函數(shù) 參數(shù)赁温。
// 報(bào)錯(cuò)
function f([(z)]) { return z; }
// 報(bào)錯(cuò)
function f([z,(x)]) { return x; }



  1. 賦值語句的模式。
// 全部報(bào)錯(cuò)
({ p: a }) = { p: 42 };
([a]) = [5];

// 報(bào)錯(cuò)
[({ p: a }), { x: c }] = [{}, {}];

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末淤齐,一起剝皮案震驚了整個(gè)濱河市股囊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌更啄,老刑警劉巖稚疹,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異祭务,居然都是意外死亡内狗,警方通過查閱死者的電腦和手機(jī)怪嫌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來柳沙,“玉大人喇勋,你說我怎么就攤上這事≠诵校” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵贰拿,是天一觀的道長蛤袒。 經(jīng)常有香客問我,道長膨更,這世上最難降的妖魔是什么妙真? 我笑而不...
    開封第一講書人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮荚守,結(jié)果婚禮上珍德,老公的妹妹穿的比我還像新娘。我一直安慰自己矗漾,他們只是感情好锈候,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著敞贡,像睡著了一般泵琳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上誊役,一...
    開封第一講書人閱讀 49,816評(píng)論 1 290
  • 那天获列,我揣著相機(jī)與錄音,去河邊找鬼蛔垢。 笑死击孩,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的鹏漆。 我是一名探鬼主播巩梢,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼艺玲!你這毒婦竟也來了且改?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤板驳,失蹤者是張志新(化名)和其女友劉穎又跛,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體若治,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡慨蓝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年感混,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片礼烈。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡弧满,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出此熬,到底是詐尸還是另有隱情庭呜,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布犀忱,位于F島的核電站募谎,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏阴汇。R本人自食惡果不足惜数冬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望搀庶。 院中可真熱鬧拐纱,春花似錦、人聲如沸哥倔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽咆蒿。三九已至咕宿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蜡秽,已是汗流浹背府阀。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留芽突,地道東北人试浙。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像寞蚌,于是被迫代替她去往敵國和親田巴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348