JavaScript - ES6 - 解構賦值 deconstructing
過去陣列和物件內的元素在賦值時,都是透過一一給值的方式達成,在 ES6 中,可以透過解構的方式一次賦值,有效減少程式碼
陣列解構賦值 Array deconstructing
以往陣列賦值都是直接給值如下
1  | let onePiece = ["魯夫", "索隆", "娜美", "香吉士", "騙人布"];  | 
ES6 一般用法
1  | let [captain, fighter, navigator, chef, sniper] = onePiece;  | 
輸入的變數量 “少於” 給得值或遇到空變數
如果輸入的變數量 “少於” 給得值或遇到空變數,只有指定到的變數有值,其餘都會直接跳過
1  | let [captain, fighter, , chef] = onePiece;  | 
輸入的變數量 “多於” 給得值
而如果輸入的變數量 “多於” 給得值就會賦予 undefined
1  | let [captain, fighter, navigator, chef, sniper, doctor] = onePiece  | 
賦予預設值
在輸入的變數中也可以賦予預設值,如果變數沒有取得對應的值,就會直接帶入預設值
1  | let [captain = '從缺', fighter, navigator, chef, sniper, doctor = '喬巴'] = onePiece  | 
互換變數
傳值是有順序性的,且傳遞是及時的,不需要第三方變數來取代,所以可以直接透過解構賦值的方式互換變數順序以交換變數值
1  | let captain = '魯夫';  | 
賦予字串
如果解構方法所賦予的值是字串時,就會將字串一一拆解成單一字元賦予到變數上
1  | let promise = "3D2Y";  | 
物件解構賦值 Object deconstructing
物件解構和陣列解構有相同的解構概念,不同的地方在於對應的值,陣列解構是透過索引的 “順序” 對應,而物件解構是透過 “屬性名稱” 來對應
1  | let onePiece = {  | 
要注意的是新的物件屬性名稱必須和原物件屬性名稱相同,因為以上寫法其實是屬性和值的名稱相同時的 “縮寫”
1  | let {captain: captain, fighter:fighter}  | 
冒號 : 前的屬性名稱只是對應,真正賦值的是冒號 : 後的值,從改變值的名稱就可以了解其中概念
1  | let {captain: cap, fighter: fight} = onePiece;  | 
輸入的變數量與給得值 “不同” 或遇到空變數
與陣列不同的是,因為物件是採屬性名稱對應而不是順序對應,所以遇到空變數會出現錯誤 Error,變數量與給得值也沒有數量對應問題,沒有對應到相同屬性就是 undefined
1  | let {captain, , navigator} = onePiece; // Error  | 
賦予預設值
同樣的物件解構也可以賦予預設值
1  | let {captain = '魯夫', fighter} = {fighter: '索隆'};  | 
應用
以下介紹幾個在 ES6 解構賦值常使用到的情境
指定參數
解構賦值有許多實際的應用,若將其運用到函式參數中,就能 “指定” 要帶入的參數而不是直接按照順序帶入
1  | function battle({fighter1 = '魯夫', fighter2 }){  | 
解構賦值搭配縮寫與展開
在前面提到,如果直接將物件賦予到新物件上,是透過 “傳址” 的方式複製,如果改變其一,兩者都會更改
1  | const onePiece = {  | 
這時候就可以透過 “解構賦值” 與 “縮寫” 的方式賦予新物件
1  | const newTeam = {  | 
但這樣的結果形式和原來的不一樣,因為是將物件直接帶入,所以內容是物件 onePiece 和 變數 navigator,所以要透過展開 ... 將物件內容釋放出來
1  | const newTeam = {  | 
其他應用可以參考以下連結