arguments的定义是对象,但是因为对象的属性是无序的,而arguments是用来存储实参的,是有顺序的,它具备和数组相同的访问性质及方式,并拥有数组长度属性length,所以arguments是特殊的对象,又叫类数组对象,当我们听到类数组时就可以知道说的是arguments。
即arguments是一个类数组对象,用来存储实际传递给函数的参数.
function fn() {
console.log(arguments);
console.log(typeof arguments); // object
console.log(toString.call(arguments)); // [object Arguments]
}
fn('name', 'age');
1. 转化成真实数组
arguments是类数组对象,除了length属性和索引元素之外没有任何Array属性。例如,它没有 pop方法。但是它可以被转换为一个真正的Array:
Array.prototype.slice.call(arguments);Array.from(arguments);[...arguments];
function f5(){
// 可以使用slice来将arguments转换为真实数组
var args1 = Array.prototype.slice.call(arguments);
var args2 = [].slice.call(arguments);
// 也可以使用Array.from()方法或者扩展运算符来将arguments转换为真实数组
var args3 = Array.from(arguments);
var args4 = [...arguments];
}
f5('name', 'age');
2. callee属性
arguments有一个callee属性,返回正被执行的Function对象。
function f3() {
console.log(arguments.callee === f3); // true
}
f3('name', 'age');
借用arguments.callee让匿名函数实现递归
let sum = function (n) {
if (n == 1) {
return 1;
} else {
return n + arguments.callee(n - 1); // 5 4 3 2 1
}
}
console.log(sum(6)); // 21
3. 遍历参数求和或求最大值
function max () {
var max = arguments[0];
for (item of arguments) {
if (item > max) {
max = item;
}
}
return max;
}
console.log(max(5, 3, 2, 9, 4)); // 9
4. 模拟函数重载
用arguments对象判断传递给函数的参数个数,即可模拟函数重载:
function doAdd() {
if(arguments.length == 1) {
console.log(arguments[0] + 5);
} else if(arguments.length == 2) {
console.log(arguments[0] + arguments[1]);
}
}
doAdd(10); // 15
doAdd(10, 20); // 30
5. 总结
- 1、
arguments是一个类数组对象,用来存储实参;具有length、callee等属性;可以用arguments[0]这个形式访问实参;可以转换为真实数组。 - 2、
arguments和函数相关联,其只有在函数执行时可用,不能显式创建。 - 3、
arguments可以用来遍历参数;通过callee实现递归;也可以模拟函数重载。