剩余參數(shù)(rest parameter)允許長(zhǎng)度不確定的實(shí)參表示為一個(gè)數(shù)組。
描述
如果一個(gè)函數(shù)的最后一個(gè)形參是以 ...
為前綴的,則在函數(shù)被調(diào)用是捉超,該形參會(huì)成為一個(gè)數(shù)組,數(shù)組中的元素都是傳遞給該函數(shù)的多出來(lái)的實(shí)參的值唯绍。
如下例子中拼岳,theArgs
會(huì)包含傳遞給函數(shù)的從第三個(gè)實(shí)參開(kāi)始到最后所有的實(shí)參。
剩余參數(shù)惡化 arguments 對(duì)象的區(qū)別
剩余參數(shù)和 arguments 對(duì)象的區(qū)別主要有三個(gè):
- 剩余參數(shù)只包含那些沒(méi)有對(duì)應(yīng)形參的實(shí)參况芒,而 arguments 對(duì)象包含了傳給函數(shù)的所有實(shí)參惜纸。
- arguments 對(duì)象不是一個(gè)真實(shí)的數(shù)組,而剩余參數(shù)是真實(shí)的Array實(shí)例牛柒,也就是說(shuō)你能夠在它上面直接使用所有的數(shù)組方法堪簿,比如 sort, map 皮壁,forEach , pop哪审。
- arguments 對(duì)象還有一些附加的屬性(比如callee屬性)
arguments 對(duì)象轉(zhuǎn)換為剩余參數(shù)
使用剩余參數(shù)可以避免將 arguments 轉(zhuǎn)為數(shù)組的麻煩
// 下面的代碼模擬了剩余數(shù)組
function f(a, b){
var args = Array.prototype.slice.call(arguments, f.length);
// ...
}
// 現(xiàn)在代碼可以簡(jiǎn)化為這樣了
function(a, b, ...args) {
}
示例
因?yàn)閠heArgs是個(gè)數(shù)組,所以你可以使用length屬性得到剩余參數(shù)的個(gè)數(shù):
function fun1(...theArgs) {
alert(theArgs.length);
}
fun1(); // 彈出 "0", 因?yàn)閠heArgs沒(méi)有元素
fun1(5); // 彈出 "1", 因?yàn)閠heArgs只有一個(gè)元素
fun1(5, 6, 7); // 彈出 "3", 因?yàn)閠heArgs有三個(gè)元素
下例中, 剩余參數(shù)包含了從第二個(gè)到最后的所有實(shí)參. 然后用第一個(gè)實(shí)參依次乘以它們:
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);
下例演示了你可以在剩余參數(shù)上使用任意的數(shù)組方法,而arguments對(duì)象不可以:
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; // 不會(huì)執(zhí)行到這里
}
alert(sortArguments(5,3,7,1)); // 拋出TypeError異常:arguments.sort is not a function