~~~js
function(a, b, ...theArgs) {
// ...
}
~~~
如果函數的最后一個命名參數以`...`為前綴,則它將成為一個由剩余參數組成的真數組,其中從`0`(包括)到`theArgs.length`(排除)的元素由傳遞給函數的實際參數提供。
### 剩余參數和?`arguments`對象的區別
剩余參數和?arguments對象之間的區別主要有三個:
* 剩余參數只包含那些沒有對應形參的實參,而`arguments`對象包含了傳給函數的所有實參。
* `arguments`對象不是一個真正的數組,而剩余參數是真正的?Array實例,也就是說你能夠在它上面直接使用所有的數組方法,比如sort,map,forEach,pop
* `arguments`對象還有一些附加的屬性?(如`callee`屬性)。
### 從 arguments?到數組
~~~
// Before rest parameters, "arguments" could be converted to a normal array using:
function f(a, b) {
var normalArray = Array.prototype.slice.call(arguments);
// -- or --
var normalArray = [].slice.call(arguments);
// -- or --
var normalArray = Array.from(arguments);
var first = normalArray.shift(); // OK, gives the first argument
var first = arguments.shift(); // ERROR (arguments is not a normal array)
}
// Now we can easily gain access to a normal array using a rest parameter
function f(...args) {
var normalArray = args;
var first = normalArray.shift(); // OK, gives the first argument
}
~~~