一、...args剩余参数(展开运算符)
允许一个表达式在某处展开。展开运算法
在 多个参数(函数调用)、多个元素(用于数组和字面量)和多个变量(用于解构赋值) 地方使用。剩余参数语法允许我们将一个不定数量的参数表示为一个数组。
如果函数的最后一个命名参数以 ...
为前缀,则它会将所有后面剩余的是实参个数包裹成一个数组。
// 例子
function test(a, b, ...args) {
console.log(args)
}
test(1,2,3,4) // [3, 4]
二、arguments对象
在函数代码中,使用特殊对象 arguments
,开发者无需明确指出参数名,就能访问它们。arguments
对象并不是一个数组,是一个类数组对象,在调用时请注意。
arguments 中包含了函数传递的参数、length、和 callee 属性。
length 属性表示的是实参的长度,即调用函数的时候传入的参数个数。
callee 属性则指向的函数自身,我们可以通过它来调用自身函数。
arguments 是一个经典的类数组对象,我们可以通过Function.call 或者 Function.apply 方法来间接调用数组的方法,也可以直接通过 Array.prototype.slice 或 Array.prototype.splice 等方法把类数组对象转换成真正的数组。
三、...args剩余参数和 arguments对象的区别
- 剩余参数只包含那些没有对应形参的实参,而 arguments 对象包含了传给函数的所有实参。
- arguments对象不是一个真正的数组,而剩余参数是真正的 Array实例,也就是说你能够在它上面直接使用所有的数组方法,比如 sort,map,forEach或pop。
- arguments对象还有一些附加的属性 (如callee属性)。