arguments对象用于处理不确定数量的实参,是类数组对象,可通过索引和length访问参数,需转换为真数组才能使用map等方法,严格模式下形参与arguments解耦,ES5旧环境或底层工具中仍有价值。

JavaScript 函数的 arguments 对象主要用于处理**不确定数量的实参**,尤其在兼容老环境或需要底层控制的场景中仍有实用价值。它不是数组,但能通过索引和 length 访问所有传入参数,使用时需注意其类数组特性与限制。
获取并遍历所有实参
当函数形参个数固定但调用时可能传入更多参数时,arguments 是唯一能拿到“额外参数”的方式:
- 用
arguments.length判断实际传了多少个值 - 用
arguments[i]按下标读取第i+1个参数(从 0 开始) - 适合写通用工具函数,比如不限参数个数的求和、拼接、类型校验等
示例:一个兼容 IE8 的求和函数
function sum() {let total = 0;
for (let i = 0; i < arguments.length; i++) {
total += arguments[i];
}
return total;
}
sum(1, 2, 3, 4); // 返回 10
把 arguments 转成真数组再操作
因为 arguments 不支持 map、filter、reduce 等方法,常需转换:
立即学习“Java免费学习笔记(深入)”;
-
Array.prototype.slice.call(arguments)(ES5 兼容写法) -
Array.from(arguments)(推荐,语义清晰,支持映射) -
[...arguments]不可用——arguments在 ES5 中不可迭代,扩展运算符会报错
转换后就能用现代数组方法了,比如:
function max() {return Math.max(...Array.from(arguments));
}
max(5, 2, 9, 1); // 9
注意形参与 arguments 的同步关系
在非严格模式下,修改 arguments[0] 会同时改变第一个形参的值,反之亦然:
console.log(a === arguments[0]); // true
arguments[0] = 100;
console.log(a); // 100
}
f(5);
但在 "use strict" 下,这种绑定被断开,两者完全独立——这是避免意外副作用的重要实践。
哪些情况还值得用 arguments?
日常开发中,rest 参数(...args)已全面取代 arguments,但以下情形仍需考虑它:
- 维护只支持 ES5 的旧项目(如需兼容 IE8/9)
- 编写 polyfill 或底层运行时工具(例如模拟
Function.prototype.bind) - 需要访问
arguments.callee(极少见,已废弃,不建议使用) - 调试时快速查看全部实参,比依赖命名参数更直观
箭头函数没有 arguments,这点务必留意——若混用箭头函数与普通函数,arguments 不会自动继承,会直接报错。


















