剩余參數(rest parameter)允許長度不確定的實參表示為一個數組。
描述
如果一個函數的最后一個形參是以 ...
為前綴的,則在函數被調用是,該形參會成為一個數組,數組中的元素都是傳遞給該函數的多出來的實參的值。
如下例子中,theArgs
會包含傳遞給函數的從第三個實參開始到最后所有的實參。
剩余參數惡化 arguments 對象的區別
剩余參數和 arguments 對象的區別主要有三個:
- 剩余參數只包含那些沒有對應形參的實參,而 arguments 對象包含了傳給函數的所有實參。
- arguments 對象不是一個真實的數組,而剩余參數是真實的Array實例,也就是說你能夠在它上面直接使用所有的數組方法,比如 sort, map ,forEach , pop。
- arguments 對象還有一些附加的屬性(比如callee屬性)
arguments 對象轉換為剩余參數
使用剩余參數可以避免將 arguments 轉為數組的麻煩
// 下面的代碼模擬了剩余數組
function f(a, b){
var args = Array.prototype.slice.call(arguments, f.length);
// ...
}
// 現在代碼可以簡化為這樣了
function(a, b, ...args) {
}
示例
因為theArgs是個數組,所以你可以使用length屬性得到剩余參數的個數:
function fun1(...theArgs) {
alert(theArgs.length);
}
fun1(); // 彈出 "0", 因為theArgs沒有元素
fun1(5); // 彈出 "1", 因為theArgs只有一個元素
fun1(5, 6, 7); // 彈出 "3", 因為theArgs有三個元素
下例中, 剩余參數包含了從第二個到最后的所有實參. 然后用第一個實參依次乘以它們:
function multiply(multiplier, ...theArgs) {
return theArgs.map(function (element) {
return multiplier * element;
});
}
var arr = multiply(2, 1, 2, 3);
// [2, 4, 6]
console.log(arr);
下例演示了你可以在剩余參數上使用任意的數組方法,而arguments對象不可以:
function sortRestArgs(...theArgs) {
var sortedArgs = theArgs.sort();
return sortedArgs;
}
alert(sortRestArgs(5,3,7,1)); // 彈出 1,3,5,7
function sortArguments() {
var sortedArgs = arguments.sort();
return sortedArgs; // 不會執行到這里
}
alert(sortArguments(5,3,7,1)); // 拋出TypeError異常:arguments.sort is not a function