剩余参数(...)允许函数接收不定数量实参并自动封装为真数组,必须位于形参末位,可与普通参数共存,替代了arguments类数组对象,支持直接调用数组方法且兼容箭头函数。

JavaScript 剩余参数(Rest Parameters)是一种语法特性,用三个点 ... 表示,允许函数接收**不定数量的实参**,并将它们收集为一个真正的数组。它替代了过去依赖 arguments 类数组对象的写法,更简洁、更强大。
剩余参数的基本写法
剩余参数必须是函数最后一个形参,且前面不能有其他普通参数(除非用默认值或解构等配合)。它会把调用时“多出来的”参数自动装进一个数组里。
- 正确写法:
function sum(...numbers) { return numbers.reduce((a, b) => a + b, 0); } - 错误写法:
function demo(a, ...rest, b) { }(剩余参数不能在中间) - 可与普通参数共存:
function greet(first, ...others) { console.log(first, others); }
和 arguments 的关键区别
arguments 是类数组对象,没有数组方法(如 map、filter),需要手动转成数组;而剩余参数本身就是 Array 实例,开箱即用。
- 旧方式:
Array.from(arguments).map(x => x * 2)或[...arguments].map(...) - 新方式:
numbers.map(x => x * 2)(直接调用) -
arguments在箭头函数中不可用,剩余参数可以用于任何函数(包括箭头函数)
常见实用场景
剩余参数特别适合封装工具函数、代理调用、参数预处理等场景。
立即学习“Java免费学习笔记(深入)”;
-
合并多个数组:
const merge = (...arrays) => [].concat(...arrays); -
带默认前缀的日志函数:
const log = (prefix, ...msgs) => console.log(`[${prefix}]`, ...msgs); -
函数柯里化或转发:
const delay = (fn, ms, ...args) => setTimeout(() => fn(...args), ms);
注意边界情况
调用时没传额外参数,剩余参数就是空数组,不会是 undefined,这点很安全。
-
sum()→numbers是[],reduce可正常返回初始值 - 但若函数逻辑依赖至少一个参数,仍需自行校验,比如
if (numbers.length === 0) throw new Error('至少传一个数'); - 不能和
arguments混用:用了剩余参数后,arguments依然存在,但不推荐再用











