一、argumens伪数组
1.arguments对象是函数的内置属性,本身是一个伪数组
JavaScript中,arguments对象是比较特别的一个对象,实际上是当前函数的一个内置属性,(与this一样,都是内置属性)。也就是说所有函数都内置了一个arguments对象,arguments对象中存储了传递的所有实参。arguments是一个伪数组,因此可以进行遍历,并且有length属性。例如我们要求多个数之和时,就可以用到arguments:
function sum(){
let sum;
for(let i = 0; i<arguments.length;i++){
sum += arguments[i];
}
return sum
}
注意:arguments只是伪数组,并不是真正的数组,因此不能调用数组的方法。但可以使用call调用数组的slice方法,将arguments对象转为数组
var arr = new Array(1,2,3,4,5);
arr.forEach( (val)=>{...})
arguments.forEach( (val)=>{...}) //报错
function test(){
var arr = Array.prototype.slice.call(arguments);
return arr.reverse();
}
alert(test(1,2,3,4));
2.arguments的callee属性
callee属性的含义是表示对当前函数对象的引用。利于这个属性可以实现无名函数的递归或者保证函数的封装性。
var sum=function(n){
if(1==n) {
return 1;
} else {
return n + arguments.callee(n-1);
}
}
alert(sum(100));
二、rest参数
ES6中的rest参数与argument是伪数组作用相类似,都可以用来存储所以传入的实参,形式为(...变量名),不同的是该变量名是一个数组。同样还是多个数字求和:
function sum(...values){
let sum;
for(var val of values){
sum += val;
}
return sum;
}
此外还要注意rest参数之后不能再有其他参数即function f(a,...b,c)就会报错
注意:箭头函数中不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用 rest 参数代替。
总结:
arguments对象的特性:
- arguments对象是函数的内置属性,对象中存储了传递的所有实参;
- arguments对象是一个伪数组,可以实现for的遍历,有length属性;但是不能使用数组的方法
- 想要实现数组的方法可以用 Array.prototype.slice.call(arguments);将其变成数组
- arguments的callee属性表示对当前函数的引用,可以实现匿名函数的递归