JavaScript剩余参数(...args)允许函数接收任意数量实参并存为真数组,必须位于参数列表末尾;相比arguments类数组,它支持数组方法且适用于箭头函数。

JavaScript 剩余参数(Rest Parameters)是一种语法特性,允许函数接收**任意数量的实参**,并将它们自动收集为一个**真正的数组**。它用三个点 ... 加参数名表示,比如 ...args,必须放在参数列表的**最后位置**。
剩余参数 vs arguments 对象
过去常用 arguments 类数组对象来处理不定参数,但它不是数组,不能直接用 map、filter、展开运算符等;而剩余参数是标准数组,更直观、更强大。
-
arguments是类数组,没有数组方法,且在箭头函数中不可用 -
...args是真数组,支持所有数组方法和解构 - 剩余参数只捕获“未显式声明”的多余参数,
arguments包含全部传入参数
基本写法和使用场景
定义函数时,在最后一个形参前加 ...,该参数就会接收所有剩余实参:
function sum(...numbers) {
return numbers.reduce((a, b) => a + b, 0);
}
sum(1, 2); // 3
sum(1, 2, 3, 4); // 10
常见用途包括:
立即学习“Java免费学习笔记(深入)”;
- 封装多参数函数(如日志、装饰器)
- 实现函数柯里化或参数预填充
- 与解构配合,提取前几个参数再收尾部
- 转发参数给其他函数(如包装
console.log)
和解构搭配使用的技巧
可以结合数组解构,灵活分离“固定参数”和“剩余参数”:
function greet(first, second, ...others) {
console.log(`Hi, ${first} and ${second}`);
if (others.length > 0) {
console.log('Also:', others.join(', '));
}
}
greet('Alice', 'Bob', 'Charlie', 'Diana');
// Hi, Alice and Bob
// Also: Charlie, Diana
注意:剩余参数只能有一个,且必须是最后一个参数;不能和多个同级剩余参数共存,也不能出现在默认参数之后。
实际小例子:简易事件总线
用剩余参数轻松实现发布订阅模式中的多参数事件触发:
const bus = {
events: {},
on(event, handler) {
this.events[event] = this.events[event] || [];
this.events[event].push(handler);
},
emit(event, ...data) {
const handlers = this.events[event] || [];
handlers.forEach(fn => fn(...data)); // 用展开运算符传参
}
};
bus.on('user-login', (name, role) => console.log(`${name} logged in as ${role}`));
bus.emit('user-login', 'Tom', 'admin'); // Tom logged in as admin
这里 ...data 收集所有事件载荷,fn(...data) 又把它们原样展开传递,干净又灵活。











