ES6之解構(gòu)賦值

作者原文:http://hawkzz.com/blog/blog/1516004962924

為什么要使用解構(gòu)

var obj = {
    name:'Jon',
    age:22
};

var name = obj.name;
var age = obj.age;

上面代碼是我們以前開(kāi)發(fā)時(shí)經(jīng)常要使用的橄碾,從對(duì)象和數(shù)組中獲取數(shù)據(jù)蒋得,并給變量賦值级及;當(dāng)對(duì)象和數(shù)組的數(shù)據(jù)結(jié)構(gòu)比較復(fù)雜時(shí),這種方法就比較麻煩了额衙,有時(shí)需要一個(gè)個(gè)或者遍歷饮焦;所以ES6添加了解構(gòu)功能;將數(shù)據(jù)結(jié)構(gòu)打散的過(guò)程變得更加簡(jiǎn)單入偷,可以從打散后更小的部分中獲取所需的信息追驴。

數(shù)組解構(gòu)

1、基本用法

以前疏之,為變量賦值:

let a = 1;
let b = 2;
let c = 3;

ES6賦值:

let [a,b,c] = [1,2,3];
console.log(a);//1
console.log(b);//2
console.log(c);//3

數(shù)組解構(gòu)使用的是數(shù)組字面量殿雪,且解構(gòu)操作全部在數(shù)組中完成;上面代碼中锋爪,從數(shù)組[1,2,3]中分別解構(gòu)出來(lái)1,2,3這三個(gè)值丙曙,并賦值給a,b,c;這種寫(xiě)法本質(zhì)上屬于“模式匹配”其骄,只要等號(hào)兩邊的模式相同亏镰,就可以通過(guò)值在數(shù)組中的位置進(jìn)行選取,并且相對(duì)應(yīng)的賦值拯爽;

2索抓、設(shè)置默認(rèn)值

數(shù)組解構(gòu)允許在任意位置指定默認(rèn)值,當(dāng)指定位置的元素其值不存在或者為undefined的時(shí)候,使用其默認(rèn)值逼肯;

let [x = 3] = [1];
console.log(x);//1

let [y = 4] = [];
console.log(y);//4

let [z = 5] = [undefined];
console.log(z);//5

let [a = 2] = [null];
console.log(a);//null

如果一個(gè)數(shù)組成員是null耸黑,默認(rèn)值不會(huì)生效,因?yàn)閚ull === undefined為false篮幢;

3大刊、嵌套數(shù)組解構(gòu)

當(dāng)數(shù)組里嵌套一個(gè)數(shù)組時(shí),即可將數(shù)組解構(gòu)過(guò)程深入下一層三椿;

let [a,b,[c,d],e] = [1,2,[3,4],5];

console.log(a);//1
console.log(c);//3

4缺菌、解構(gòu)失敗和不完全解構(gòu)

解構(gòu)失敗出現(xiàn)是因?yàn)樽筮厰?shù)組的元素比右邊的元素多,這樣就造成左邊變量的值為undefined;

let [a] = [];
console.log(a);//undefined

let [b,c,d] = [1,2];
console.log(b);//1
console.log(c);//2
console.log(d);//undefined

不完全解構(gòu)表示左邊的數(shù)組元素比右邊的元素少搜锰,只能匹配部分右邊的元素伴郁;

let [a, b, c] = [1, 2, 3, 4];
console.log(a);//1
console.log(b);//2
console.log(c);//3

let [x, [y]] = [1, [2,3]];
console.log(x);//1
console.log(y);//2

如果等號(hào)的右邊不是數(shù)組,那么將會(huì)報(bào)錯(cuò)蛋叼;

5蛾绎、交換變量的值

通常我們要交換兩個(gè)變量的值都需要使用到第三個(gè)變量;

let x = 1;
let y = 2;
let tmp;

tmp = x;
x = y;
y = x;

現(xiàn)在我們使用ES6的數(shù)組解構(gòu)能很方便的實(shí)現(xiàn):

let x = 1;
let y = 2;

[x,y] = [y,x];

console.log(x);//2
console.log(y);//1

對(duì)象解構(gòu)

1鸦列、基本用法

對(duì)象解構(gòu)語(yǔ)法形式是在一個(gè)賦值操作符左邊放置一個(gè)對(duì)象字面量:

let obj = {
    name:'Jon',
    age:22
};

let {name,age} = obj;

console.log(name);//'Jon'
console.log(age);//22

在上面代碼中租冠,obj.name解構(gòu)儲(chǔ)存在變量name中,obj.age解構(gòu)儲(chǔ)存在變量age中薯嗤;對(duì)象的解構(gòu)和數(shù)組有一個(gè)重要的不同顽爹,就是對(duì)象的屬性沒(méi)有次序,只要變量名和屬性名相同就行骆姐;

let {age,name} = obj;
console.log(name);//'Jon'
console.log(age);//22

2镜粤、設(shè)置默認(rèn)值

和數(shù)組解構(gòu)一樣,對(duì)象解構(gòu)也可以設(shè)置默認(rèn)值玻褪;

let {x = 3} = {};
console.log(x);//3

let {y,z = 3} = {y:5};
console.log(y);//5
console.log(z);//3

let {a = 3 ,b} = {};
console.log(a);//a
console.log(b);//undefined

let {c = 3}  = {c:undefined};
console.log(c);//3

let {d = 3} = {c:null};
console.log(d);//3

從上面代碼中可以看出肉渴,當(dāng)對(duì)象的屬性值為undefined或者為空時(shí),默認(rèn)值才會(huì)生效带射;

3同规、設(shè)置別名

我們現(xiàn)在有這么一個(gè)場(chǎng)景,后臺(tái)給的JSON數(shù)據(jù)里的屬性名和前端定義的變量值不一樣窟社;那么就可以通過(guò)設(shè)置別名來(lái)進(jìn)行結(jié)構(gòu):

let obj = {
    foo:'Hello',
    bar:'World'
};

let {foo:name,bar} = obj;

console.log(name);//Hello
console.log(bar);//World
console.log(foo);//error:foo is not defined

從上面的代碼看出券勺,obj.foo的值賦值給變量name;在這里foo已經(jīng)不是變量灿里,只是匹配模式关炼,所以無(wú)法找到;對(duì)象解構(gòu)賦值的內(nèi)部機(jī)制匣吊,是先找到同名屬性儒拂,然后在賦值給對(duì)應(yīng)的變量寸潦;

4、嵌套解構(gòu)

和數(shù)組解構(gòu)一樣社痛,對(duì)象解構(gòu)也可以嵌套:

let obj = {
    line: {
        start: {
            row: 2,
            column: 3
        },
        end: {
            row: 3,
            column: 4
        }
    },
    circle: 9
};

let {line, line: {start}, line: {start: {row}}, circle} = obj;
console.log(line);//{start:{row:2,column:3},end:{row:3,column:4}}
console.log(start);//{row:2,column:3}
console.log(row);//2
console.log(circle);//9

5甸祭、已聲明變量的解構(gòu)

給一個(gè)已聲明的變量解構(gòu),是一件很麻煩的事褥影;如果按照以前的方法:

let x ;

{x} = {x:1};//error

會(huì)報(bào)錯(cuò),因?yàn)镴avaScript引擎會(huì)將{x}理解城代碼塊咏雌,從而發(fā)生語(yǔ)法錯(cuò)誤凡怎;那如何避免JavaScript將其解釋為代碼塊,就只有讓大括號(hào)不寫(xiě)在行首赊抖;

let x;
({x} = {x:1});
console.log(x);//1

上面代碼將整個(gè)解構(gòu)賦值語(yǔ)句统倒,放在一個(gè)圓括號(hào)里面,就可以正確執(zhí)行氛雪。

函數(shù)參數(shù)解構(gòu)

1房匆、基本用法

function fn([x, y]) {
    console.log(x + y);
}

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

function fn2({x, y}) {
    console.log(x * y);
}
fn2({x:1,y:2});//2

從上面代碼可以看出,函數(shù)參數(shù)的解構(gòu)其實(shí)就是變成數(shù)組的解構(gòu)或者對(duì)象的解構(gòu)报亩;

2浴鸿、設(shè)置默認(rèn)值

函數(shù)參數(shù)解構(gòu)可以設(shè)置默認(rèn)值,這樣就可以避免缺少值而報(bào)錯(cuò)的情況弦追;

function fn({x = 2,y = 3} = {}) {
    console.log([x,y]);
}
fn({x:3,y:4});//[3,4]
fn({x:3});//[3,3]
fn({});//[2,3]
fn();//[2,3]
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末岳链,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子劲件,更是在濱河造成了極大的恐慌掸哑,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件零远,死亡現(xiàn)場(chǎng)離奇詭異苗分,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)牵辣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)摔癣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人纬向,你說(shuō)我怎么就攤上這事供填。” “怎么了罢猪?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵近她,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我膳帕,道長(zhǎng)粘捎,這世上最難降的妖魔是什么薇缅? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮攒磨,結(jié)果婚禮上泳桦,老公的妹妹穿的比我還像新娘。我一直安慰自己娩缰,他們只是感情好灸撰,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著拼坎,像睡著了一般浮毯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上泰鸡,一...
    開(kāi)封第一講書(shū)人閱讀 49,764評(píng)論 1 290
  • 那天债蓝,我揣著相機(jī)與錄音,去河邊找鬼盛龄。 笑死饰迹,一個(gè)胖子當(dāng)著我的面吹牛余舶,可吹牛的內(nèi)容都是我干的啊鸭。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼匿值,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼千扔!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤趟大,失蹤者是張志新(化名)和其女友劉穎罕伯,沒(méi)想到半個(gè)月后追他,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡懈糯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年硅堆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了硬萍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片朴乖。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖群叶,靈堂內(nèi)的尸體忽然破棺而出街立,到底是詐尸還是另有隱情赎离,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站个盆,受9級(jí)特大地震影響鸡岗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜揣苏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望稼跳。 院中可真熱鬧,春花似錦红淡、人聲如沸俊嗽。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)被饿。三九已至狭握,卻和暖如春闪金,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背论颅。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工哎垦, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人嗅辣。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓撼泛,卻偏偏與公主長(zhǎng)得像挠说,于是被迫代替她去往敵國(guó)和親澡谭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 1. const const用來(lái)聲明常量损俭,一旦聲明必須立即初始化蛙奖,否則報(bào)錯(cuò).作用域與let相同,只在聲明所在的塊級(jí)...
    BubbleM閱讀 169評(píng)論 0 0
  • 什么是解構(gòu)? 正統(tǒng)解釋?zhuān)喊凑找欢J剿鲈啵瑥臄?shù)組和對(duì)象中提取值攒砖,然后對(duì)變量進(jìn)行賦值。 直白理解:模式匹配日裙,映射關(guān)系吹艇,只...
    貴在隨心閱讀 2,539評(píng)論 0 4
  • 解構(gòu)賦值 傳統(tǒng)的定義多個(gè)變量: Es6中為了簡(jiǎn)單問(wèn)題簡(jiǎn)單化,出現(xiàn)了解構(gòu)賦值這一方法昂拂,比如上邊的變量可以這樣定義: ...
    嘿喵heyMeow閱讀 411評(píng)論 0 1
  • 第2章 基本語(yǔ)法 2.1 概述 基本句法和變量 語(yǔ)句 JavaScript程序的執(zhí)行單位為行(line)受神,也就是一...
    悟名先生閱讀 4,131評(píng)論 0 13
  • 事業(yè) 朋友說(shuō),自己的得失心太重格侯,所以工作中患得患失的情緒影響到自己工作中的狀態(tài)鼻听。尤其是最近這段時(shí)間财著,公司面臨裁員的...
    _七秒_閱讀 162評(píng)論 0 0