1. arguments 是一个类似数组的对象, 和传递给函数的参数相对应。
2. arguments 对象是所有函数(箭头函数除外)中可用的局部变量。
3. 可以使用 arguments 对象在函数中引用传入函数的参数。此对象包含传递给函数的每个参数,第一个参数的索引从0开始。
function func1() {
console.log(arguments[0]);
console.log(arguments[1]);
}
func1('a','b'); //输出 a b
func1('c') //输出 c undefined
func1() //输出 undefined undefined
注意:
(1) 获取函数参数时,下标从 0 开始,例如 arguments[0] 获取传入函数的第一个参数,arguments[1] 获取传入函数的第二个参数
(2) 函数不传入参数时 arguments[i] 均为 undefined
(3) 使用 arguments[i] 获取传入函数的参数时, i 大于等于传入函数参数的个数时,也是 undefined。例如传入函数三个参数, 获取 argument[4], arguments[5] 都为 undefined
(4) arguments 对象的值可以设置, 如 arguments[1]='new value';
4. arguments 对象转化为真正的数组
ES5 的方法:
var args = Array.prototype.slice.call(arguments);
var args = [].slice.call(arguments);
var args = (arguments.length === 1 ? [arguments[0]] : Array.apply(null,arguments));
ES6 的方法:
var args= Array.from(arguments);
var args = [...arguments];
数据类型判断: arguments 对象数据类型是 object, 不是array
function func2() {
console.log(arguments.length);
console.log(typeof arguments);
console.log(typeof arguments[0]);
}
func2() //输出 0 'object' undefined
func2('a',3,4) //输出 3 'object' 'string'
func2(2,3) //输出 2 'object' 'number'
5. 剩余参数、默认参数以及结构赋值参数对 arguments 对象的影响
(1). 严格模式 ('strict mode'): 剩余参数,默认参数,结构赋值参数的存在不会改变 arguments 对象的行为
(2). 非严格模式 (non-strict code)
当非严格模式的函数不包含剩余参数,默认参数,或结构赋值参数时, arguments 对象将跟踪参数的变化
例子1:
function func(a) {
arguments[0] = 99; // 修改了 arguments[0] 的同时也更新了 a
console.log(a);
}
func(10); // 99
例子2:
function func(a) {
a = 200; // 修改了 a 的同时也更新了 arguments[0]
console.log(arguments[0]);
}
func(10); // 200
当非严格模式的函数包含有剩余参数,默认参数,或结构赋值参数时, arguments 对象将不会跟踪参数的变化
例子1:
function func(a=55) {
arguments[0] = 99; // 有默认参数,修改 arguments[0] 不会影响 a
console.log(a);
}
func(10); // 10
例子2:
function func(a=55) {
a = 200; // 有默认参数,修改 a 不会影响 arguments[0]
console.log(arguments[0]);
}
func(10); // 10
例子3:
function func(a=55) {
console.log(a);
console.log(arguments[0]);
}
func(); // 55 undefined
//函数调用的时候没有传递参数,所以 arguments[0] 为 undefined,而当发现没有传值的时候 a 就会取默认值 55
6.arguments 对象的 ES6 替代 ...rest (剩余参数)
function foo(...args) {
console.log(Array.isArray(args));
return args;
}
foo(); // true []
foo(24,66); // true [24,66]
7. arguments 对象在箭头函数 (arrow function) 中不可用
var f = () => {
console.log(arguments);
}
f(); // 报错:ReferenceError: arguments is not defined
//箭头函数
var f1 = () => {
console.log(typeof arguments);
}
f1(); // undefined
//普通函数
function f2() {
console.log(typeof arguments);
}
f2(); // object
箭头函数中的 arguments 其实是获取的外层非箭头函数的 arguments 对象,如果不存在则是 undefined
function f3(){
//返回一个箭头函数,函数中引用了 arguments 对象,其实是引用的外层 f3 函数的 arguments 对象
return (p) => {
console.log(arguments[0]);
console.log(p);
};
}
var a = f3();
var b = a(566); // undefined 566
var a = f3(123);
var b = a(566); // 123 566
8.arguments 对象的一些属性
arguments.length 传递给当前函数的参数数量
arguments.callee 当前执行的函数 (非标准,不建议使用)
arguments.caller 指调用当前函数的函数(废弃api,不建议使用)
//函数 f1 利用 arguments 和 arguments.callee 写了一个求阶乘的函数
function f1() {
if (arguments[0] === 1) return 1;
return arguments[0] * arguments.callee(arguments[0]-1)
}
f1(5); //120
function f2() {
return arguments.length;
}
f2() === 0;
f2('a') === 1;
f2('a',23,55,'c') === 4;
网友评论