剩余参数:…theArgs
剩余参数的描述
如果函数的最后一个命名参数以…为前缀,则它将成为一个由剩余参数组成的真数组,其中从0(包括)到theArgs.length(排除)的元素由传递给函数的实际参数提供。1
语法:
function(a, b, ...theArgs) {
//statements
}
- 直接这样写也行
function(...theArgs) {
//statements
}
//或者
function(...[a,b]){
//statements
}
//但这样写必须传入2个实参,否则看本文后面
statements是组成函数的声明语句,也就是函数内部的代码块
特点
…theArgs和arguments对象是有区别的
参数分为实参和形参
区别1:
剩余参数只包含那些没有对应形参的实参,而 arguments 对象包含了传给函数的所有实参。就像上面的语法1那样,参数的a,b都是形参,传入参数之后有具体的映射。而…theArgs,则是除a和b之外其余传入的那些没有形参的参数,所以…theArgs也是一个数组Array。
区别2:
继上一点,arguments对象虽然包含了所有传入函数的实参,但它并不是一个真正的Array,但可以通过转换变成一个Array来使用,后面具体说。但…theArgs是真正的Array,可以使用所有的Array方法。
区别3:
arguments对象具有一些如callee之类的附加属性,而…theArgs没有。
使用
…theArgs可以被解构,通过解构赋值分包到不同的变量中,使用起来很灵活,当然我个人认为,直接当数组来检索使用也行。
就像这样:
function name(...[a, b, c]) {
return a + b + c;
}
name(1,2,3);//6
/*
如果传入实参少于3个(a,b,c)
返回NaN,提示b和c are define;
如果传入参数大于3个,返回6,
提示the fourth parameter is not destructured
*/
arguments对象转换成数组
示例
function f(a,b,c,d) {
var normalArray = Array.prototype.slice.call(arguments);
// -- or --
var normalArray = [].slice.call(arguments);
// -- or --
var normalArray = Array.from(arguments);
}
//用其中一种就可以了
学习总结
个人认为剩余参数在一些情况下提供了一个很方便的途径(有时参数很多或者抽象函数的时候),可以更灵活的调用参数,对于需要确切映射的参数,也可以通过转换arguments对象,有更灵活的方法来调用。
注:这段总结仅限目前的理解,以后有更深入理解的时候再更新一下吧,欢迎大佬的指正。
文章引用: