解構賦值 (Destructuring assignment)
可以把陣列或物件中的資料解開擷取成為獨立變數。
用於提取(extract)陣列或物件中的資料,新語法可以讓程式碼在撰寫時更為簡短與提高閱讀性。
Day 08: ES6篇 - Destructuring Assignment(解構賦值)
解構賦值可以想像是鏡子的概念,將右方的資料往左邊送,然後會一個位置對一個值 (但沒有像鏡子左右顛倒)。
卡斯伯-鐵人賽:ES6 解構賦值
語法
1 | //字串-拆成一個一個字元 |
解構順序依左至右
1 | const a = [1, 2, 3, 4] |
陣列解構
陣列以順序的索引值對應
1 | const foo = ['one', 'two', 'three']; |
預設值
當解構還原陣列對應的元素是undefined
,變數為預設值
1 | let a , b; |
變數交換👍
兩個變數可以透過一個解構指派式交換
1 | const arr = [1, 2, 3]; |
解析自函式回傳的陣列
函式可以回傳陣列,而解構指派示可以讓回傳值更簡潔
1 | function f(){ |
忽略回傳值
1 | function f() { |
物件解構
物件以物件的屬性名稱(key)做對應,沒有順序性
基本指派示
1 | const o = {p: 42, q: true}; |
就目前解讀為什麼要這樣做(一)?
如果沒有const {p, q} = o;
1 | console.log(p) //p is not defined` |
透過解構賦值後,可以直接透過物件的key取到value
為什麼要這樣做(二)?
1 | const o = {p: 42, q: true}; |
無宣告指派
1 | let a, b; |
⚠️ 針對物件解構時,指派示必須加上(){a, b} = {a: 1 , b: 2}
左邊的{a,b}會被視為程式碼區塊而非物件
預設值
當解構物件中對應的值為undefined
時,變數可以設定預設值
1 | const {a = 10, b = 5} = {a: 3}; |
1 | const {a: aa = 10, b: bb = 5} = {a: 3}; |
當函數的parameter為物件時
1 | const userDD = {id: 42, displayName: 'DD', fullName:{firstName: 'Hung',lastName: 'Di'}} |
從物件中提出的id
, displayName
和firstName
並印出
設定函式parameter為物件,且有預設值
1 | function drawChart({size = 'big',coords = {x: 0, y: 0},radius = 25}={}){ |
⚠️ drawChart的parameter中,左方的解構式被指派到一個空物件,{size = 'big', coords = {x: 0, y: 0}, radius = 25} = {}
如果沒有寫右方的指派式,函式在呼叫時會找出最少一個參數。指派到空物件的作法,可以直接不使用參數呼叫drawChart();
範例
循環取出的解構
1 | const people = [{name: 'Mike Smith',family:{mother: 'Sally', father: 'Joey Smith'},age: 35}, |
題目
宣告兩個具有5個元素的整數陣列 arr1
和 arr2
,並利用陣列設定初值的方式,將 arr1[0] ~ arr1[4]
分別設值為 2, 3, 1, 7, 9, arr2[0] ~ arr2[4]
分別設值為 8, 7, 9, 3, 1,將 arr1 與 arr2 兩陣列對應項相加,列印出相加後的陣列
1 | //js09.js 介面 |
1 | //js09_module 程式 |
解釋
js09_module中第12行
1 | sumValue({arr1,arr2}) //為sumValue({array1:array1, array2:array2:})的簡寫 |
將function sumValue(inputArray)
帶入參數{array1, array2}
在第3行中
1 | const length = inputArray.arr1.length; |
相當於以下語法:
1 | const length = {array1: array1= [2, 3, 1, 7, 9], array2: array2= [8, 7, 9, 3, 1]}.array1.length; |
下面的語法就以此類推啦~
換一個比較短的例子會比較好理解
1 | const a = [1, 2, 3]; |
參考
Day 08: ES6篇 - Destructuring Assignment(解構賦值)
MDN - Destructuring assignment