arguments 是函数内自动存在的类数组对象,保存所有实参但非真正的 array 实例,无 push/map 等方法;索引为只读字符串属性(如"0"),length 只读且仅由调用时实参数量决定;非严格模式下与命名参数双向绑定,严格模式下解耦;转真数组推荐 array.from(arguments) 或 [...arguments]。

arguments 是 JavaScript 中函数内部自动存在的类数组对象,它保存了调用该函数时传入的所有实参。虽然它长得像数组(有数字索引、有 length 属性),但它**不是真正的 Array 实例**,因此不具备 push、map、forEach 等数组方法。
索引是纯数字,且从 0 开始连续递增
每个传入的参数都会按顺序被赋予一个数字属性名(即索引):
- 第一个参数 →
arguments[0] - 第二个参数 →
arguments[1] - 以此类推,直到
arguments[length - 1]
这些索引是只读字符串属性名(如 "0"、"1"),但 JS 允许用方括号数字语法访问,所以看起来和数组一样。注意:即使某个位置未传参,只要索引在 0 到 length-1 范围内,该属性就存在,值为 undefined。
length 属性反映实际传入参数个数,不随参数修改而自动更新
arguments.length 是一个**只读数值**,等于函数调用时传入的实参数量:
-
fn()→arguments.length === 0 -
fn(1, "a")→arguments.length === 2 -
fn(undefined, null, 42)→arguments.length === 3
即使你在函数体内给 arguments[5] = "new",length 不会变成 6;同样,删除 arguments[0] 也不会让 length 减小 —— 它只由调用时的参数列表决定。
arguments 支持动态修改值,且与命名参数双向绑定(严格模式下例外)
在非严格模式下,修改 arguments[i] 会同步影响同位置的命名参数,反之亦然:
function test(a, b) {
console.log(a, b); // 1, 2
arguments[0] = 99;
console.log(a); // 99 ← 改变了
}
test(1, 2);
但在严格模式("use strict")中,这种绑定被解除:arguments 和形参完全独立,互不影响。这是避免意外副作用的重要设计变化。
获取真数组推荐用 Array.from 或扩展运算符
要对 arguments 做数组操作,需先转为真数组:
Array.from(arguments)-
[...arguments](ES6+,最简洁) -
Array.prototype.slice.call(arguments)(旧写法,兼容性好)
注意:不要用 Array.prototype.map.call(arguments, ...) 直接调用,虽可行但可读性差;优先转成数组再操作更清晰、安全。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











