JavaScript ES6 Spread/Rest Operator 運算子

ES6 引入了新的運算子 (operator) ... (三個點號) 來表示展開或其餘運算子。

Spread Operator 展開運算子

Spread Operator 可以用在執行函數時的參數列上,它可以將一個陣列 (array) 展開,轉為多個逗點隔開的獨立參數:

function foo(x, y, z) {
    console.log(x, y, z);
}

var arr = [1, 2, 3];

// 輸出 1 2 3
// 等同於執行 foo(1, 2, 3)
foo(...arr);

也可以放在多個參數中間使用:

function foo(a, b, c, d, e) {
    console.log(a, b, c, d, e);
}

var arr = [3, 4];

// 輸出 1 2 3 4 5
// 等同於執行 foo(1, 2, 3, 4, 5)
foo(1, 2, ...arr, 5);

Spread Operator 也可以用在 array literal,用來展開陣列元素:

var parts = ['shoulders', 'knees']; 

// 將 parts 展開在 lyrics 的元素中
var lyrics = ['head', ...parts, 'and', 'toes'];

// lyrics 的值會變成 ["head", "shoulders", "knees", "and", "toes"]

Spread Operator 也可以用來結合 (concat) 多個陣列:

var ary1 = [4, 5, 6];
var ary2 = [1, 2, 3];

// ary1 會變成 [1, 2, 3, 4, 5, 6]
ary1 = [...ary2, ...ary1];

Rest Operator 其餘運算子

在 ES6 之前,如果你想要一個函數可以接受不固定數量的參數,你可能會這樣寫:

function fn(a, b) {
  var args = Array.prototype.slice.call(arguments, fn.length);

  // ...
}

ES6 新的 Rest Operator 讓你可以更直觀的宣告不定長度參數。

上面的函數,用 Rest Operator 可以改寫為:

function fn(a, b, ...args) {
    // ...
}

...args 只能放在最後一個參數,用來獲取其餘的參數,args 的值是一個陣列 (array),用來存放獲取的參數。

使用例子:

function fun1(...myArgs) {
  console.log(myArgs);
}

// 顯示 []
fun1();

// 顯示 [1]
fun1(1);

// 顯示 [5, 6, 7]
fun1(5, 6, 7);

IE 最新版瀏覽器 IE11 目前還不支援 Spread/Rest Operator。