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 = { |
其他應用可以參考以下連結