在學 React 框架的三大屬性的 props 時,看到了一個神奇的東西「三個點點」,原本來以為它只是當有很多 props 要傳遞時,可以直接用「…」取代,就不用每個 props 都寫 ( 超讚!)。後來發現原來我太小看它了,它好用的地方才不止這個呢,陣列、物件、函數都可以用,所以直接回頭到 Javascript ,把這三個點的用法一次挖出來
這次要筆記的就是:
展開運算子 Spread Operator

快速尋找
概述:JavaScript 中的 … 展開運算子有很多用途,例如在呼叫函數、建立陣列和物件時,可以用來展開陣列、字串、物件等可迭代的元素
1. 複製陣列
說明:
把一個陣列原模原樣的複製出來
不過這裡的複製是屬於「淺層」複製,也就是說如果原本的陣列裡面「不只一層」時,則用展開運算符後,去修改複製後的陣列,會同時修改到原本的陣列 ( 因為內部都指向同一個記憶體 )
寫法:
copiedArray = [...originArray]
範例:
arr2 去複製 arr1,再把 arr2 的第一個元素值 1 改成 9
→ arr1 依舊是原本的 [1, 2, 3, 4, 5]
→ arr2 會變成 [9, 2, 3, 4, 5]

arr2 去複製 arr1,再把 arr2 的第一個元素值的 name 屬性 betty 改成 Cindy
→ arr1 和 arr2 都會變成 [{name: ‘Cindy’, age: 18}] ,因為原陣列不只一層,而展開運算子只是淺層複製

2. 合併陣列
說明:
將兩個陣列合併變成一個新的陣列
寫法:
mergeArray = [...array1, ...array2, ...array3]
範例:
將第一個和第二個陣列合併一起,放在第三個新陣列

3. 複製物件+修改屬性值
說明:
不只是複製物件,還可以在複製當下,把屬性值改掉,這超好用!
跟複製陣列同理,這裡的複製是屬於「淺層」複製,只要原本的物件裡面「不只一層」時,則用展開運算符後,去修改複製後的物件,會同時修改到原本的物件 ( 因為內部都指向同一個記憶體 )
寫法:
// 複製物件
copiedObject = {...originObject}
// 複製物件+修改屬性值
copiedObject = {...originObject, key: newValue}
範例:
obj2 去複製 obj1,同時把 obj2 的 id 值改成 002、name 值改成 Denny
→ obj1 依舊是原本的 { id:’001′, name:’Leo’, age: 20 }
→ obj2 會變成 { id: ‘002’, name: ‘Denny’, age: 20 }

obj2 去複製 obj1,再把 obj2 的 address 內的 city 改成 Taipei
→ obj1 和 obj2 都會變成 { name: ‘Alice’, address: { city:’Taipei’, num:22 } },因為原物件不只一層,而展開運算子只是淺層複製

4. 在函數調用
說明:
當參數很多且也不確定有幾個參數時,就可以使用展開運算子,這樣就不用在宣告中函式去逐一寫每個參數
寫法:
function fuc(...parameter) {
// 執行內容
}
fuc(param1,param2,param3,param4)
範例:
將所有參數 1~10 相加,並回傳相加結果
