MDN:arguments对象是所有(非箭头)函数中都可用的局部变量。你可以使用arguments对象在函数中引用函数的参数。arguments对象不是一个 Array 。它类似于Array,但除了length属性和索引元素之外没有任何Array属性。

分析

MDN的介绍中,arguments对象描述有以下关键词:

  1. 非箭头函数中的局部变量;
  2. 引用函数的参数;
  3. 类数组对象;

下面一一来确认及展开。

非箭头函数局部变量

ES6箭头函数内部没有arguments局部变量。

箭头函数arguments

ES6箭头函数最为熟知的属性之一是它没有自己的this,在它内部访问this时,访问的是上层作用域的this,这里的arguments变量也是。

箭头函数arguments来源

引用函数的参数

如果函数参数是引用类型参数,在使用arguments变量时要小心。

引用类型参数

类数组对象

虽然arguments元素访问的方式是按下标进行获取的,但这不能说明他就是一个数组,他的结构是这样的:

(function ('args1', [200], {name: 'params'}) {})()
/** arguments是这样一个对象 */
{
  0: 'args1',
  1: [200],
  2: {name: 'params'},
  length: 3,
  callee,
  [Symbol.iterator],
}

arguments对象的属性由:

它虽然可以按下标去获取数据,但是它的类型是个对象,所以不可使用数组方法。

console.log(arguments[0]) // 'args1'
console.log(arguments[1]) // [200]

arguments.pop() // Uncaught TypeError: arguments.pop is not a function

// 由于 arguments 对象上有迭代器属性,所以其可以使用for循环
for (const key of arguments) {
  console.log(key)
}

类数组对象可转换成真正的数组:

Array.prototype.slice.call(arguments) // ['args1', [200], {name: 'params'}]
// 或ES6数组方法
Array.from(arguments) // ['args1', [200], {name: 'params'}]

##

综上,arguments对象的特性了解记录。