小記3 - 1解構(gòu)賦值:更高效的提取變量 - 解構(gòu)數(shù)組

背景:解構(gòu)(destructuring)有何用杯矩?

let heros   =   {                               
          no1:  "呂布",                               
          no2:  "張飛",
          weapons:  [ "刀","劍","弓箭"]     
};
//  從對(duì)象中提取數(shù)據(jù)
 let lb = heros.no1,  zs = heros.no2, weapons = heros.weapons;

想象一下,若heros中有100萬(wàn)個(gè)變量需要提取處理呢沽损?若 是多層嵌套的數(shù)據(jù)結(jié)構(gòu)呢?可能會(huì)為了一點(diǎn)數(shù)據(jù)而挖掘整個(gè)結(jié)構(gòu)猛计,做大量低效重復(fù)的工作唠摹。

解構(gòu)賦值

解構(gòu)賦值--使得把數(shù)據(jù)結(jié)構(gòu)分解為更小的部分時(shí),提取數(shù)據(jù)會(huì)變得更容易有滑,更高效跃闹。
解構(gòu)賦值語(yǔ)法是一種 Javascript 表達(dá)式。解構(gòu)使用的語(yǔ)法--就是對(duì)象與數(shù)組的字面量語(yǔ)法毛好。--按照一定模式望艺,從數(shù)組和對(duì)象中提取值,對(duì)變量進(jìn)行賦值肌访,這被稱為解構(gòu)(Destructuring)找默。

基本原則如下:

數(shù)組的元素是按次序排列的,變量的取值由它的位置決定吼驶;
對(duì)象的屬性沒(méi)有次序惩激,變量必須與屬性同名,才能取到正確的值蟹演。

數(shù)組的解構(gòu)賦值

1 變量聲明并賦值時(shí)的解構(gòu) 或者先聲明變量再賦值
let  foo = ["one", "two", "three"];
let  [m, n, three] = foo;
console.log(m); // "one"
console.log(n); // "two"
console.log(three); // "three"
//-或者
let [foo, [[bar], baz]] = [1, [[2], 3]];
console.log(foo); // 1
console.log(bar); // 2
console.log(baz); // 3


//先聲明再賦值
let a, b;
[a, b] = [1, 2];

注意1:在使用 var 风钻、 let 、 const 進(jìn)行數(shù)組解構(gòu)時(shí)酒请,必須提供初始化 器(即等號(hào) 右邊的值)

const [a ,b];
let [d,e];
// Uncaught SyntaxError: Missing initializer in destructuring declaration

注意2:如果解構(gòu)不成功骡技,變量的值就等于undefined。

let [foo] = [];
let [bar, foo] = [1];
//以上兩種情況都屬于解構(gòu)不成功羞反,foo的值都會(huì)等于undefined布朦。

注意3:不完全解構(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

注意4:解構(gòu)報(bào)錯(cuò)--如果等號(hào)的右邊不是數(shù)組(或者嚴(yán)格地說(shuō)澄惊,不是可遍歷的結(jié)構(gòu)唆途,不具備 Iterator 接口),那么將會(huì)報(bào)錯(cuò)掸驱。

// 報(bào)錯(cuò)
let [foo] = 1;
let [foo] = false;
let [foo] = NaN;
let [foo] = undefined;
let [foo] = null;
let [foo] = {};
2 忽略某些值窘哈,只對(duì)感興趣值解構(gòu)
let [ , , third] = ["foo", "bar", "baz"];  //逗號(hào)-, 為數(shù)組前面的項(xiàng)提供的占位符
console.log(third);  // "baz"
3 默認(rèn)值

ES6 解構(gòu)內(nèi)部使用嚴(yán)格相等運(yùn)算符(===),判斷一個(gè)位置是否有值亭敢。所以,只有當(dāng)一個(gè)數(shù)組成員嚴(yán)格等于undefined图筹,默認(rèn)值才會(huì)生效帅刀。

const [a=5, b=7] = [1];
console.log(a); // 1
console.log(b); // 7  --默認(rèn)值生效

let [x = 1] = [undefined];
x // 1   --默認(rèn)值生效
let [x = 1] = [null];
x // null

注意1:如果默認(rèn)值是一個(gè)表達(dá)式让腹,那么這個(gè)表達(dá)式是惰性求值的,即只有在用到的時(shí)候扣溺,才會(huì)求值骇窍。

function f() {
    console.log('aaa');
}
let [x = f()] = [1];  //因?yàn)閤能取到值,所以函數(shù)f根本不會(huì)執(zhí)行锥余。

//上面的代碼其實(shí)等價(jià)于下面的代碼腹纳。
let x;
if ([1][0] === undefined) {
  x = f();
} else {
  x = [1][0];
}

注意2:默認(rèn)值可以引用解構(gòu)賦值的其他變量,但該變量必須已經(jīng)聲明驱犹。

let [x = 1, y = x] = [2];    // x=2; y=2
let [x = y, y = 1] = [];     // ReferenceError: y is not defined 
//--因?yàn)閤用y做默認(rèn)值時(shí)嘲恍,y還沒(méi)有聲明
4 剩余項(xiàng) (...) -- 將剩余數(shù)組賦值給一個(gè)變量(數(shù)組)

當(dāng)解構(gòu)一個(gè)數(shù)組時(shí),可以使用剩余模式雄驹,將數(shù)組剩余部分賦值給一個(gè)變量佃牛。

var [a, ...b] = [1, 2, 3];
console.log(a); // 1
console.log(b); // [2, 3]   --注意,這是個(gè)數(shù)組

注意:如果剩余元素右側(cè)有逗號(hào)医舆,會(huì)拋出 SyntaxError俘侠,因?yàn)槭S嘣乇仨毷菙?shù)組的最后一個(gè)元素,之后不能再有逗號(hào)蔬将,否則就是語(yǔ)法錯(cuò)誤爷速。

var [a, ...b,] = [1, 2, 3];
// SyntaxError: rest element may not have a trailing comma

應(yīng)用1::若要取出特定項(xiàng) 并要求保留剩余的值,則剩余項(xiàng)是非常有用的霞怀。
應(yīng)用2:方便地克隆數(shù)組在JS中是個(gè)明顯被遺漏的功能惫东。
在ES5中常用的concat()方法來(lái)克隆數(shù)組 (方便簡(jiǎn)單);在ES6中里烦,使用剩余項(xiàng)的語(yǔ)法克隆數(shù)組(小技巧)

//  在   ES5 中克隆數(shù)組 
let colors  =   [   "red",  "green",    "blue"  ]; 
let clonedColors    =   colors.concat();
colors[2]   = "skyblue";
console.log(clonedColors);      //"[red,green,blue]"

concat()方法本意是合并兩個(gè)數(shù)組凿蒜,但不使用任何參數(shù)來(lái)調(diào)用此方法,會(huì)獲得原 數(shù)組的一個(gè)克隆品胁黑。

//  在ES6中废封,使用剩余項(xiàng)的語(yǔ)法克隆數(shù)組 ,達(dá)到上述同樣效果
let colors  =   [   "red",  "green",    "blue"  ]; 
let [   ...clonedColors ]   =   colors;
colors[2]   = "skyblue";
console.log(clonedColors);      //"[red,green,blue]"
5 嵌套的數(shù)組 解構(gòu)

在整個(gè)解構(gòu)模式中插入另一 個(gè)數(shù)組模式丧蘸,解構(gòu)操作會(huì)下行到 嵌套的數(shù)組中漂洋。可以使用任意深 度的數(shù)組嵌套解構(gòu)力喷。

let colors = [  "red",[ "green", "lightgreen" ],    "blue"  ];
let [   firstColor, [   secondColor ]   ]   =   colors;
console.log(firstColor);    //  "red" 
console.log(secondColor);  //   "green" 

應(yīng)用篇

交換變量 - 在一個(gè)解構(gòu)表達(dá)式中可以輕松交換兩個(gè)變量的值刽漂。
//在 ES5 中互換值需要使用第三個(gè)變量作為臨時(shí)變量:
 let    a = 1, b = 2, tmp;
 tmp    =a ;  a = b;  b = tmp;
console.log(a); //  2 
console.log(b); //  1
//  在   ES6 中互換值 
let a = 1, b    =   2;
[   a,  b   ]   =   [   b,  a   ];
console.log(a); //  2 
console.log(b);       //1
解析一個(gè)從函數(shù)返回的數(shù)組

從一個(gè)函數(shù)返回一個(gè)數(shù)組是十分常見(jiàn)的情況。解構(gòu)使得處理返回值為數(shù)組時(shí)更加方便弟孟。

function f() {
  return [1, 2];
}
let a, b; 
[a, b] = f(); 
console.log(a); // 1
console.log(b); // 2

總結(jié)

本質(zhì)上贝咙,解構(gòu)賦值這種寫(xiě)法屬于“模式匹配”,只要等號(hào)兩邊的模式相同拂募,左邊的變量就會(huì)被賦予對(duì)應(yīng)的值庭猩。
數(shù)組的元素是按次序排列的窟她,變量的取值由它的位置決定;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蔼水,一起剝皮案震驚了整個(gè)濱河市震糖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌趴腋,老刑警劉巖吊说,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異优炬,居然都是意外死亡颁井,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門穿剖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蚤蔓,“玉大人,你說(shuō)我怎么就攤上這事糊余⌒阌郑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵贬芥,是天一觀的道長(zhǎng)吐辙。 經(jīng)常有香客問(wèn)我,道長(zhǎng)蘸劈,這世上最難降的妖魔是什么昏苏? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮威沫,結(jié)果婚禮上贤惯,老公的妹妹穿的比我還像新娘。我一直安慰自己棒掠,他們只是感情好孵构,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著烟很,像睡著了一般颈墅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上雾袱,一...
    開(kāi)封第一講書(shū)人閱讀 51,462評(píng)論 1 302
  • 那天恤筛,我揣著相機(jī)與錄音,去河邊找鬼芹橡。 笑死毒坛,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的林说。 我是一名探鬼主播粘驰,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼屡谐,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了蝌数?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤度秘,失蹤者是張志新(化名)和其女友劉穎顶伞,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體剑梳,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡唆貌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了垢乙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锨咙。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖追逮,靈堂內(nèi)的尸體忽然破棺而出酪刀,到底是詐尸還是另有隱情,我是刑警寧澤钮孵,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布骂倘,位于F島的核電站,受9級(jí)特大地震影響巴席,放射性物質(zhì)發(fā)生泄漏历涝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一漾唉、第九天 我趴在偏房一處隱蔽的房頂上張望荧库。 院中可真熱鬧,春花似錦赵刑、人聲如沸分衫。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)丐箩。三九已至,卻和暖如春恤煞,著一層夾襖步出監(jiān)牢的瞬間屎勘,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工居扒, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留概漱,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓喜喂,卻偏偏與公主長(zhǎng)得像瓤摧,于是被迫代替她去往敵國(guó)和親竿裂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354