rest参数是ES6新增的真数组,可直接调用数组方法;arguments是传统类数组对象,仅存于非箭头函数中且需转换才能使用数组方法。

剩余参数(rest parameters)和 arguments 对象都能获取函数调用时传入的“多余”实参,但它们本质不同:rest 是真正的数组,arguments 是类数组对象;rest 是 ES6 新增语法,arguments 是传统机制,且在箭头函数中不可用。
语法与类型差异
rest 参数使用 ...args 语法声明,必须是函数最后一个形参,它接收的是一个真正的 Array 实例,可直接调用 map、filter、reduce 等方法。arguments 是每个普通函数内部自动存在的局部变量,它不是数组,而是类数组对象(有 length 和数字索引,但没有数组方法)。
- rest 示例:
function sum(...nums) { return nums.reduce((a, b) => a + b, 0); }——nums可直接 reduce -
arguments示例:function sum() { return Array.from(arguments).reduce((a, b) => a + b, 0); }—— 必须先转数组才能用 reduce
作用域与函数类型限制
rest 参数是显式声明的形参,属于函数作用域的一部分,支持解构、默认值等现代语法;arguments 仅存在于非箭头函数中,箭头函数没有自己的 arguments,访问会向上查找外层函数的 arguments(可能出错或 undefined)。
- rest 在箭头函数中完全可用:
const avg = (...nums) => nums.reduce((a, b) => a + b, 0) / (nums.length || 1); -
arguments在箭头函数中报错:const bad = () => console.log(arguments); // ReferenceError 或指向外层
与其余形参的共存关系
rest 参数可以和普通形参共存,只要它在参数列表末尾;arguments 则总是包含所有实参,不管有没有命名形参,也无法选择性忽略前几个参数。
- rest 支持混合声明:
function greet(prefix, ...names) { return names.map(n => `${prefix}, ${n}!`); } -
arguments无法区分哪些是“已命名”,哪些是“额外”的:greet('Hello', 'Alice', 'Bob')中arguments是['Hello', 'Alice', 'Bob'],需手动切片处理
性能与可读性考量
rest 参数语义清晰、类型明确,现代引擎对其优化良好;arguments 因历史原因存在一些隐藏开销(如禁用某些 V8 优化),且代码可读性较差,容易引发维护困惑。
- 推荐优先使用 rest:更安全、更直观、兼容性足够(ES6+ 环境普遍支持)
- 仅在需兼容极老环境(如 IE11 以下)或特殊调试场景(如代理函数中透传全部参数)时才考虑
arguments - 避免混用:
function f(a, ...rest) { console.log(arguments); }—— 此时arguments仍含全部参数,但语义冗余且易误用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











