arguments 是一个类数组对象。代表传给一个function的参数列表。
1.1 arguments length
arguments 是个类数组对象,其包含一个 length
属性,可以用 arguments.length
来获得传入函数的参数个数。
function func() {
console.log("The number of parameters is " + arguments.length);
} func();
func(1, 2);
func(1, 2, 3);
执行结果如下:
The number of parameters is 0
The number of parameters is 2
The number of parameters is 3
1.2 arguments 转数组
通常使用下面的方法来将 arguments 转换成数组:
Array.prototype.slice.call(arguments);
[].slice.call(arguments);
1.3 leaking arguments
另外,有一个需要注意的地方就是,不能将函数的 arguments 泄露或者传递出去。什么意思呢?看下面的几个泄露 arguments 的例子:
// Leaking arguments example1:
function getArgs() {
return arguments;
} // Leaking arguments example2:
function getArgs() {
const args = [].slice.call(arguments);
return args;
} // Leaking arguments example3:
function getArgs() {
const args = arguments;
return function() {
return args;
};
}
上面的做法就直接将函数的 arguments 对象泄露出去了,最终的结果就是 V8 引擎将会跳过优化,导致相当大的性能损失。
可以这样做:
function getArgs3 () {
const args = new Array(arguments.length)
for (let i = 0; i < args.length; i++) {
args[i] = arguments[i]
}
return args;
}
1.4 修改arguments的值
// 修改arguments的值
function foo(a) {
"use strict";
console.log(a, arguments[0]); // 1 1
a = 10;
console.log(a, arguments[0]); // 10 1
arguments[0] = 20;
console.log(a, arguments[0]); // 10 20
}
foo(1);
function bar(a) {
console.log('-----非严格模式下的值变化------')
console.log(a, arguments[0]); // 1 1
a = 10;
console.log(a, arguments[0]); // 10 10
arguments[0] = 20;
console.log(a, arguments[0]); // 20 20
}
bar(1);
从上面的两个例子中可以看出,在严格模式下,函数中的参数与 arguments 对象没有联系,修改一个值不会改变另一个值。而在非严格模式下,两个会互相影响。