在ES5中,arguments是处理不定长参数的唯一原生机制,它是类数组对象,有length属性和索引访问能力,但无数组方法,需用slice.call等方法转为真数组才能调用push、map等。

在 ES5 环境中,arguments 是处理不定长参数的唯一原生机制。它自动存在于每个函数作用域内,无需声明,直接可用——但要注意它不是真正的数组,而是一个“类数组对象”。
arguments 的基本特性与访问方式
arguments 对象具备以下关键特征:
- 拥有 length 属性,值等于实际传入的参数个数(与形参数量无关)
- 支持按索引访问:如
arguments[0]、arguments[1],对应第一个、第二个实参 - 不具有数组方法:不能直接调用
push()、map()、forEach()等 - 存在 callee 属性,指向当前正在执行的函数(可用于递归,但严格模式下禁用)
常见实用操作示例
虽然不能直接用数组方法,但可通过兼容写法完成典型任务:
-
求和:遍历
arguments并累加 -
取最大值:初始化
max = arguments[0],再逐项比较 -
参数校验:用
arguments.length判断是否满足最少参数要求 -
兼容多态逻辑:根据参数个数分支处理(如
doAdd(10)返回 20,doAdd(10, 20)返回 30)
绕过“非数组”限制的常用技巧
要使用数组方法,必须先将 arguments 转为真数组:
- 用
Array.prototype.slice.call(arguments)(ES5 最稳妥方式) - 用
Array.prototype.concat.apply([], arguments) - 用
Array.from(arguments)(注意:ES6 新增,ES5 环境不可用) - 手动构建数组:
var arr = []; for (var i = 0; i
需要避开的典型坑点
使用 arguments 时容易忽略的关键细节:
- 箭头函数没有
arguments对象(它继承外层作用域的 this,也不绑定 arguments) - 当形参与 arguments 同时存在且有默认值或未传参时,二者**不同步**:修改
arguments[0]不会改变形参值,反之亦然(除非两者都已赋值) - 严格模式下,修改
arguments或访问callee会报错 - 无法解构:不能写
const [a, b] = arguments,会报错或返回 undefined

















