展開運算子(Spread Operator)、其餘參數(Rest Operator)
展開運算子( Spread Operator )
展開運算子是”把一個陣列展開(expand)成個別數值“的速寫語法,簡單來說,就是把陣列裡面的值,拆解成一個一個。
1 | //陣列 |
1 | //===========過去寫法=========== |
你也可以用來把陣列展開,傳入函式之中,例如下面加總函式的範例:
1 | function sum(a, b, c) { |
淺層複製
另外陣列與物件相同都有著傳參考的特性,所以當把陣列賦予到另一個值上時,修改其中一個另一個也會跟著變動。
1 | // 由於傳參考的關係,所以將一個陣列傳到另一個上時 |
由於 展開運算子 它是一個一個將值寫入,所以他也有淺層的複製(shallow copy) 。
1 | // 這個屬於淺拷貝,所以不會影響到另一個物件 |
因為是淺層的複製,所以當陣列的值是放 物件 的話,依舊會因為傳參考的特性,而修改其中一個另一個也會跟著變動。
1 | let groupA = [{name:'老大'},{name:'老二'},{name:'老三'}]; |
類陣列轉成純陣列
JavaScript 中有許多類陣列,這類陣列有著陣列的外皮,但卻不能使用陣列的方法,這類陣列由於原型不同,所以 不能 使用許多的陣列方法,如: map(), concat() 等等。
其中一種很常見的就是 DOM 陣列,此時我們就可以用 展開運算子 轉為 純陣列,這樣就可以使用陣列的各種方法。
1 | // 可以將類陣列轉成陣列 |
範例 arguments
以前要使用函式的 arguments 時,寫法僅可用 for 或 for..in 依序取得參數值。
1 | function sum() { |
但是若將 arguments 改寫用 陣列的方法(forEach、map、reduce) 的話,程式碼就會出錯。
1 | function sum() { |
現在可透過 展開運算子 轉為 純陣列,就可使用 陣列的方法(forEach、map、reduce)。
1 | function sum() { |
其餘參數(Rest Operator)
有時候,Function 接受的參數數量不固定,而 其餘參數(Rest Operator) 的功能就是把多的參數併成一個 Array。
範例1
可傳入不固定的參數,1個 or 多個 皆可..
1 | function sum(...numbers) { |
範例2
如果function有先定義別的參數,就會將傳入的參數值先給定義好的參數,剩下的就全部塞入其餘參數。
1 | function restArray(x, y, ...others) { |
其餘參數(Rest parameters)有一個限制,就是這個參數一定是函式的「最後一個」。
你如果放在其餘的參數前,就會產生錯誤。
1 | function restArray(...others, x, y) { |
- arguments 不是真的陣列,其餘參數則「是」。
- arguments 不能混用自訂傳入的參數。