剩余参数
剩余参数语法允许我们将一个不定数量的参数表示为一个数组。
剩余参数的语法形式是三个点后跟一个标志符。
语法:
1 function(a, b, ...theArgs) { 2 //函数体 3 }
如果函数的最后一个命名参数以 ... 为前缀,则它将成为一个由剩余参数组成的真数组,其中从0(包括)到theArgs.length(排除)的元素由传递给函数的实际参数提供。
1 function sum(...theArgs) { 2 return theArgs.reduce((previous, current) => { 3 return previous + current; 4 }); 5 } 6 7 console.log(sum(1, 2, 3)); //6 8 9 console.log(sum(1, 2, 3, 4)); //10
剩余参数和arguments对象的区别
- 剩余参数只包含那些没有对应形参的实参,而arguments对象包含了传给函数的所有实参
- arguments对象不是一个真正的数组,而剩余参数是真正的Array实例,也就是说能够在它上面直接使用所有的数组方法,比如sort,map,forEach或pop。
- arguments对象还有一些附加的属性(如callee属性)。
将arguments对象转换为数组
1 function f(a, b) { 2 var normalArray = Array.prototype.slice.call(arguments); 3 //or 4 var normalArray = [].slice.call(arguments); 5 //or 6 var normalArray = Array.from(arguments); 7 8 var first = normalArray.shift(); //OK 9 var first = arguments.shift(); //ERROR 10 } 11 12 function f(...args) { 13 var normalArray = args; 14 var first = normalArray.shift(); //OK 15 }
解构剩余参数
剩余参数可以被解构,这意味着它们的数据可以被解包到不同的变量中。
1 function f(...[a, b, c]) { 2 return a + b + c; 3 } 4 5 f(1); //NaN (b and c are undefined) 6 f(1, 2, 3) ;//6 7 f(1, 2, 3, 4); //6
注:剩余参数后面不能再跟参数。剩余参数不能与arguments对象一起使用。