arguments 是一个对应于传递给函数的参数的类数组对象。
arguments对象是所有(非箭头)函数中都可用的局部变量。 你可以使用arguments对象在函数中引用函数的参数。
只有普通函数 里参会有
此对象包含传递给函数的每个参数,第一个参数在索引0处。 例如,如果一个函数传递了三个参数,你可以以如下方式引用他们:
参数也可以被设置:
arguments[1] = 'new value';
arguments对象不是一个 Array 。它类似于Array,但除了length属性和索引元素之外没有任何Array属性。例如,它没有 pop方法。但是它可以被转换为一个真正的Array(数组):
1、call 方法
var args = Array.prototype.slice.call(arguments);
var args = [].slice.call(arguments);
2、对参数使用扩展语法
您还可以使用Array.from()方法或扩展运算符将参数转换为真实数组:
展开运算符
// ES2015
const args = Array.from(arguments);
const args = [...arguments];
属性
- arguments.callee 指向参数所属的当前执行的函数。 指向调用当前函数的函数。
- arguments.length 传递给函数的参数数量。
- arguments[@@iterator] 返回一个新的Array 迭代器 对象,该对象包含参数中每个索引的值。 【迭代器Symbol】
注意:
在严格模式下,arguments对象已与过往不同。
arguments[@@iterator]不再与函数的实际形参之间共享,同时caller属性也被移除。返回一个新的Array 迭代器 对象,该对象包含参数中每个索引的值。
在函数调用的时候,浏览器每次都会传递进两个隐式参数:
小扩充
在函数调用的时候,浏览器每次都会传递进两个隐式参数:(这里讲的是arguments)
- 函数的上下文对象this
- 封装实参的对象arguments
下面是一个例子:
function fun(){
console.log(arguments);
}
fun('tom',[1,2,3],{
name:'Janny'});
可以看到下面打印出来的结果,arguments是有值的,它的值就是我们传递进去的参数,虽然我们没有给fun函数定义形参,但是我们还是可以通过arguments来调用传递给函数fun的实参。
- 我们发现callee的值是函数fun,是不是说callee指向函数fun,我们来测试一下
function fun(){
// console.log(arguments);
console.log('arguments.callee === fun的值:',arguments.callee === fun);
}
fun('tom',[1,2,3],{
name:'Janny'});
结果如我们想的一样,callee就是指向函数fun。
- 第二个属性
length
,我们经常在数组或者类数组中看到,可以看到arguments
的原型索引__proto__的值为Object
,故此我们推测arguments
不是数组,而是一个类数组对象。
function fun(){
console.log(arguments instanceof Array);
console.log(Array.isArray(arguments));
}
fun('tom',[1,2,3],{
name:'Janny'});
结果打印出来的值都是false,说明arguments不是数组,而是一个类数组对象。
-
第三个属性是个Symbol类型的键,该类型的值都是独一无二的,该键指向的值是一个
values
函数,该值是一个生成迭代器的函数,下面是ES6入门的部分文档。
let arr = ['a', 'b', 'c'];
let iter = arr[Symbol.iterator]();
iter.next() // {
value: 'a', done: false }
iter.next() // {
value: 'b', done: false }
iter.next() // {
value: 'c', done: false }
iter.next() // {
value: undefined, done: true }
在arguments中有同样的效用。
function fun(){
console.log(arguments[Symbol.iterator]);
let iterator = arguments[Symbol.iterator]();
console.log('iterator:',iterator);
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
}
fun('tom',[1,2,3],{
name:'Janny'});
下面是arguments的迭代器枚举的值: