概念
是一种类数组对象(类似数组,但不是数组),只在函数的内部起作用,并且永远指向当前函数的调用者传入的参数
用法
1.使用arguments来得到函数的实际参数
function argumentsFn(a,b,c,d){
console.log(argumentsFn.length) //打印出形参 4
console.log(arguments.length) //打印出实参 2
console.log(arguments[0]) //打印出第1个实参 '我是第一个实参'
console.log(arguments[1])//打印出第2个实参 3
}
argumentsFn('我是第一个实参',3)
2.实现函数重载:当函数的参数个数不明确时,函数体根据参数的不同进行相应的处理
3.实现递归:在函数内部反复的调用函数本身
//需求:实现数字的叠加
function calc(num){
if(num <= 0){
return 0;
}else{
// return num += calc(num-1);//方式一(原始方法)
return num += arguments.callee(num-1)//方式二
}
}
var result = calc;
calc = null;
console.log(result(3));//6
arguments.callee :返回当前函数本身。⚠️arguments.callee的用法在严格模式下是不允许的
以上两种方式的区别:当外界定义了calc=null后,方式一会报错,因为此时calc已不是函数。但是写成 return num += arguments.callee(num - 1) 不会报错;因为arguments.callee指的是“当前函数”,并不是“calc”
类数组对象arguments和数组的区别
典型的类数组对象:{0:12, 1:23}
相同点:
- 都可以用下标访问每个元素
- 都有length属性
不同点:
- 数组对象的类型是Array,类数组对象的类型是Object;
- 类数组对象不能直接调用数组的API;
- 数组遍历可以用for in和for循环,类数组只能用for循环遍历;
类数组对象转为数组对象方法:
//方式一:
function func1() {
console.log(Array.prototype.slice.call(arguments)); // [1, 2, 3]
}
func1(1, 2, 3);
方式二:使用ES6的...运算符
function func(...arguments) {
console.log(arguments); // [1, 2, 3]
}
func(1, 2, 3);
若有不足 欢迎留言讨论