展開與其餘運算子是 ES6 的特性之一,這兩個運算子的寫法都是三個點 … ,這樣的寫法使得在做一些 Array 或 JSON 的處理時,寫法簡潔很多。
透過這篇筆記的整理,希望能更熟悉的應用在自己的實作之中。
- 展開與其餘運算子的符號是一模一樣的(…)三個點,但情況與意義不同。
- 中文(…)通常代表其餘更多或忽略,英文 Ellipsis 代表省略,也會用”three dots”與”dot-dot-dot”這三個點
- 應用在 Array 上,是 ES6 中的其中兩種新特性
- Spread 展開 : 展開陣列中的值
- Rest 其餘 : 集合其餘的值成為陣列
展開運算子(spread operator)
摘要
- 展開運算子可輕易合併多個陣列
- 可拿來淺拷貝,必免更動到原資料
- 可以 slice() 來指定取出的陣列元素
- 也可使用在物件裡並加入資料
- 可將類陣列轉成一般陣列
- 可把某個陣列展開,然後傳入函式作為傳入參數值
應用:兩組陣列合併在一起
以往大都使用 concat() 來合併兩個陣列,使用 (…) 可更靈活。
1 | let europe = ['Paris', 'Milan', 'Berlin']; |
陣列展開語法與原本處理的方法比較,使用展開的寫法簡潔許多。
1 | const values = [1, 2, 3]; |
在陣列中以展開加入資料或是,以 slice() 指定要取出的部份
1 | // 前後加資料 |
應用:在物件,以展開加入資料
在物件裡也可以使用展開運算子來加入資料,需注意,如有相同的 key 則會有被覆蓋的風險,並取最後一個。
以下面的範例來說,bar 物件本身就有一個 key a, 在以 Spread operator 的方式將 bar, bar1 加入物件時,bar1, bar2 物件也有兩 key 為 a ,所以重複的會被覆蓋,而以最後一個為主。
1 | const bar = { |
應用:淺層複製(shallow copy)
在操作陣列時,因為陣列為物件型別,以參考傳值的特性,所以複製的陣列如有修改,會改到原本的陣列。
為避免動到原始資料,可利用展開運算子來淺層拷貝。
1 | const europe = ['paris', 'Milan', 'Berlin']; |
應用:把類陣列(Array-like)轉成純陣列
類陣列無法繼承陣列的所有方法,類陣列的產生有:從 DOM 抓取而成的陣列、arguments 物件,如果要對類陣列使用部份 Array 方法,需要先轉換成一般陣列。
可利用展開運算子來轉換。
1 | const lists = document.querySelectorAll('li'); |
應用:用來把某個陣列展開,然後傳入函式作為傳入參數值,例如加總函式的範例:
1 | function sum(a, b, c) { |
其餘運算子 (rest operator)
摘要
- 其餘運算子 (rest operator)也可稱為其餘參數,也就是傳入的參數。
- 函式可以使用
arguments
來取得參數,但是arguments
為類陣列,但使用其餘運算子所取得的其餘參數則是陣列。 - 其餘運算子會收集其餘的(剩餘的)值,將其轉成一個陣列。
- 會用在函式定義時的傳入參數識別名定義(其餘參數, Rest parameters),以及解構賦值時。
- 使用情境 1. : 在函式定義中的傳入參數定義中,稱之為其餘參數(Rest parameters)。
- 使用情境 2. : 用在解構賦值時。
** 把其餘的都放在一起 **
應用:希望取前兩個各自給變數名稱,剩餘的放在另一個變數裡
1 | const city = ['Taipei', 'Paris', 'Tokyo', 'Lyon', 'Tainan']; |
其餘參數
1 | function sum(a, b, c) { |
隨時都有可以加總更多或少於參數數量的數字,遇此狀況可利用其餘參數(…valus)來改寫此函數
1 | function sum(...values) { |
其餘參數也可以和一般的函數參數使用,要注意一個函式只能有一個其餘參數,且只能寫在參數的最後一個位置
1 | function (x,y, ...values) { |
函式在接收參數時
情境:函式不確定會接收幾個參數,可使用其餘運算子的方式,讓參數無論是幾個,都會儲存成一個陣列
1 | // 加總函式 |
小練習
- 將 Paris 放到 europe 裡,其餘放在 asiaCity 裡
1 | const city = ['Paris', 'Taipei', 'Tokyo', 'Tainan']; |
- 把 food 和 drink 合併到 cafeShop 裡,並在中間加一項 beer
1 | const food = ['cookie', 'cake', 'pizza']; |
補充:
把類陣列轉成一般陣列除了可使用展開運算子外,還可使用Array.from()
關於類陣列的產生可看前端如何優雅處理類陣列物件?
參考: