ES6之解構賦值

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

為什么要使用解構

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

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

上面代碼是我們以前開發時經常要使用的,從對象和數組中獲取數據,并給變量賦值;當對象和數組的數據結構比較復雜時,這種方法就比較麻煩了,有時需要一個個或者遍歷;所以ES6添加了解構功能;將數據結構打散的過程變得更加簡單,可以從打散后更小的部分中獲取所需的信息。

數組解構

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

數組解構使用的是數組字面量,且解構操作全部在數組中完成;上面代碼中,從數組[1,2,3]中分別解構出來1,2,3這三個值,并賦值給a,b,c;這種寫法本質上屬于“模式匹配”,只要等號兩邊的模式相同,就可以通過值在數組中的位置進行選取,并且相對應的賦值;

2、設置默認值

數組解構允許在任意位置指定默認值,當指定位置的元素其值不存在或者為undefined的時候,使用其默認值;

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

如果一個數組成員是null,默認值不會生效,因為null === undefined為false;

3、嵌套數組解構

當數組里嵌套一個數組時,即可將數組解構過程深入下一層;

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

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

4、解構失敗和不完全解構

解構失敗出現是因為左邊數組的元素比右邊的元素多,這樣就造成左邊變量的值為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

不完全解構表示左邊的數組元素比右邊的元素少,只能匹配部分右邊的元素;

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

如果等號的右邊不是數組,那么將會報錯;

5、交換變量的值

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

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

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

現在我們使用ES6的數組解構能很方便的實現:

let x = 1;
let y = 2;

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

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

對象解構

1、基本用法

對象解構語法形式是在一個賦值操作符左邊放置一個對象字面量:

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

let {name,age} = obj;

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

在上面代碼中,obj.name解構儲存在變量name中,obj.age解構儲存在變量age中;對象的解構和數組有一個重要的不同,就是對象的屬性沒有次序,只要變量名和屬性名相同就行;

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

2、設置默認值

和數組解構一樣,對象解構也可以設置默認值;

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

從上面代碼中可以看出,當對象的屬性值為undefined或者為空時,默認值才會生效;

3、設置別名

我們現在有這么一個場景,后臺給的JSON數據里的屬性名和前端定義的變量值不一樣;那么就可以通過設置別名來進行結構:

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已經不是變量,只是匹配模式,所以無法找到;對象解構賦值的內部機制,是先找到同名屬性,然后在賦值給對應的變量;

4、嵌套解構

和數組解構一樣,對象解構也可以嵌套:

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、已聲明變量的解構

給一個已聲明的變量解構,是一件很麻煩的事;如果按照以前的方法:

let x ;

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

會報錯,因為JavaScript引擎會將{x}理解城代碼塊,從而發生語法錯誤;那如何避免JavaScript將其解釋為代碼塊,就只有讓大括號不寫在行首;

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

上面代碼將整個解構賦值語句,放在一個圓括號里面,就可以正確執行。

函數參數解構

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

從上面代碼可以看出,函數參數的解構其實就是變成數組的解構或者對象的解構;

2、設置默認值

函數參數解構可以設置默認值,這樣就可以避免缺少值而報錯的情況;

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]
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,501評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,673評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,610評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,939評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,668評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,004評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,001評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,173評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,705評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,426評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,656評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,139評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,833評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,247評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,580評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,371評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,621評論 2 380

推薦閱讀更多精彩內容

  • 1. const const用來聲明常量,一旦聲明必須立即初始化,否則報錯.作用域與let相同,只在聲明所在的塊級...
    BubbleM閱讀 176評論 0 0
  • 什么是解構? 正統解釋:按照一定模式,從數組和對象中提取值,然后對變量進行賦值。 直白理解:模式匹配,映射關系,只...
    貴在隨心閱讀 2,576評論 0 4
  • 解構賦值 傳統的定義多個變量: Es6中為了簡單問題簡單化,出現了解構賦值這一方法,比如上邊的變量可以這樣定義: ...
    嘿喵heyMeow閱讀 415評論 0 1
  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執行單位為行(line),也就是一...
    悟名先生閱讀 4,193評論 0 13
  • 事業 朋友說,自己的得失心太重,所以工作中患得患失的情緒影響到自己工作中的狀態。尤其是最近這段時間,公司面臨裁員的...
    _七秒_閱讀 172評論 0 0