~~~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
}
~~~