arguments 是非箭头函数中自动存在的类数组对象,含 length 和数字索引(如 arguments[0]),但无 map 等数组方法;它有 callee 属性(指向当前函数),caller 已废弃;箭头函数中不存在 arguments。

JavaScript 中的 arguments 是一个类数组对象,它自动存在于每个**非箭头函数**的作用域中,用来访问传入该函数的所有实参,即使函数没有显式声明形参。
arguments 是什么?
arguments 不是真正的数组(没有 map、forEach 等方法),但它有 length 属性和按数字索引访问的能力(如 arguments[0])。它还包含 callee(指向当前函数)和 caller(已废弃,不推荐使用)等属性。
注意:箭头函数中没有 arguments,它会沿作用域链向上查找外层函数的 arguments,通常应避免依赖它。
基本用法示例
你可以像访问数组一样读取参数:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
function sum() {
let total = 0;
for (let i = 0; i < arguments.length; i++) {
total += arguments[i];
}
return total;
}
sum(1, 2, 3); // 返回 6
将 arguments 转为真数组
为了使用数组方法,常需转换:
-
Array.from(arguments)—— 最推荐,语义清晰,兼容性好(ES6+) -
[...arguments]—— 展开运算符,简洁,但仅适用于可迭代环境(ES6+) -
Array.prototype.slice.call(arguments)—— 传统写法,兼容旧浏览器(如 IE8)
例如:
function logArgs() {
const args = Array.from(arguments);
console.log(args.map(String).join(' | '));
}
logArgs('a', 1, true); // 输出 "a | 1 | true"
常见用途与注意事项
- 实现不定参数函数:比如封装日志、重载模拟、求最大值等
-
参数校验或默认值处理:检查
arguments.length或arguments[0] !== undefined -
避免在严格模式下修改
arguments:严格模式中,改变形参值不会同步更新arguments[i],反之亦然 -
现代替代方案:优先使用剩余参数(
...args),它本身就是真数组,更安全、语义更明确
例如用剩余参数重写上面的 sum:
const sum = (...nums) => nums.reduce((a, b) => a + b, 0);
不复杂但容易忽略:arguments 是历史遗留特性,日常开发中建议优先用 ... 语法,只在需要兼容老环境或特殊场景(如代理原生函数)时才直接操作 arguments。

















