剩余参数(...args)将未被前面形参匹配的多余实参收集为真数组,必须位于形参末尾;它区别于类数组的arguments,支持直接调用map等方法,适用于柯里化、日志封装和函数代理等场景。

JavaScript 中的剩余参数(...args)用于捕获函数调用时**未被前面形参匹配的多余实参**,并自动将它们收集为一个真正的数组(Array 实例),可直接使用 map、filter、reduce 等方法。
剩余参数必须放在形参列表末尾
它不能出现在普通参数之前或中间,否则会报语法错误:
- ✅ 正确:
function fn(a, b, ...args) { } - ❌ 错误:
function fn(...args, a) { }(SyntaxError) - ❌ 错误:
function fn(a, ...args, b) { }(SyntaxError)
只收集“未被分配”的实参
剩余参数不会收集所有传入的值,而是从左到右匹配完前面的命名参数后,把剩下的部分打包成数组:
function log(first, second, ...rest) {
console.log('first:', first); // 'a'
console.log('second:', second); // 'b'
console.log('rest:', rest); // ['c', 'd', 'e']
}
log('a', 'b', 'c', 'd', 'e');
即使只传两个参数,rest 也会是空数组 [],不会报错。
与 arguments 对象的区别
...args 是真数组;而传统 arguments 是类数组对象(无数组方法,需转才可用):
-
...args.map(x => x.toUpperCase())→ ✅ 直接可用 -
arguments.map(...)→ ❌ 报错,得写Array.from(arguments).map(...)
另外,箭头函数没有 arguments,但可以正常使用剩余参数。
常见用途示例
适合需要灵活接收参数的场景:
-
函数柯里化或参数预置:如
const add = (a, b, ...more) => more.reduce((s, n) => s + n, a + b); -
封装日志/调试函数:统一加前缀再展开打印
console.log('[DEBUG]', ...args); -
代理调用其他函数:如包装
fetch时透传请求参数myFetch(url, options, ...extra) { return fetch(url, {...options, ...extra[0]}); }
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











