部分摘取于MDN Arguments 对象。
arguments 是一个对应于传递给函数的参数的类数组对象。 “类数组”表示 arguments 具有length属性和从零开始索引的属性,但是没有Array诸如forEach()和的内置方法map()。
function func1(a, b, c) {
console.log(arguments[0]);
// expected output: 1
console.log(arguments[1]);
// expected output: 2
console.log(arguments[2]);
// expected output: 3
}
func1(1, 2, 3);
描述
arguments对象是所有(非箭头)函数中都可用的局部变量。你可以使用arguments对象在函数中引用函数的参数。此对象包含传递给函数的每个参数,第一个参数在索引0处。例如,如果一个函数传递了三个参数,你可以以如下方式引用他们:
arguments[0]
arguments[1]
arguments[2]
参数也可以被设置:
arguments[1] = 'new value';
arguments对象不是一个 Array 。它类似于Array,但除了length属性和索引元素之外没有任何Array属性。 例如,它没有 pop 方法。但是它可以被转换为一个真正的Array:
var args = Array.prototype.slice.call(arguments);
var args = [].slice.call(arguments);
// ES2015
const args = Array.from(arguments);
const args = [...arguments];
对参数使用slice会阻止某些JavaScript引擎中的优化 (比如 V8 - 更多信息)。如果你关心性能,尝试通过遍历arguments对象来构造一个新的数组。另一种方法是使用被忽视的Array构造函数作为一个函数:
var args = (arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments));
对参数使用扩展语法
您还可以使用Array.from()方法或扩展运算符将参数转换为真实数组:
var args = Array.from(arguments);
var args = [...arguments];
传递函数时 fn() 调用和 arguments[0]() 调用的区别
fn() 调用 this 指向 window ,arguments0 调用 this 指向 arguments 对象。
var length = 10;
function fn() {
console.log(this.length)
}
let obj = {
method: function(fn) {
fn()//this指向window
arguments[0]()//this指向arguments
}
}
obj.method(fn, 1) //10,2
上面代码需要注意的是,必须是 var length = 10 ,不能换成 let / const 等,因为 let 等声明的变量不会绑定到 window ,无法使用 window . length 的形式调用,即上面 this.length 的形式行不通,详见 另一篇文章。
this指向问题见:javascript中this的指向问题(包括普通函数和箭头函数)