es6剩余参数用...加参数名将未匹配实参收集为真数组,必须位于形参末尾且唯一;它按顺序分配实参,生成的数组可直接调用map等方法,并常与解构、展开运算符配合使用。

ES6 剩余参数用 三个点(...)加一个参数名 的方式,把函数调用时“没被前面形参匹配上”的那些实参,自动收集成一个真正的数组。
必须放在参数列表末尾
剩余参数只能是最后一个形参,不能穿插在普通参数中间,也不能有多个:
- ✅ 正确:
function fn(a, b, ...rest) { } - ❌ 错误:
function fn(...rest, c) { }(不在末尾) - ❌ 错误:
function fn(...first, ...last) { }(只允许一个)
收集的是“未被前面参数占用”的实参
它不看总共传了几个参数,而是按定义顺序“从左到右”分配:前面的形参先占位,剩下的全归剩余参数。
- 比如
function sum(x, ...nums) { },调用sum(1, 2, 3, 4)时,x得到1,nums就是[2, 3, 4] - 即使只传一个值
sum(5),nums也是空数组[]
得到的是真数组,不是 arguments
剩余参数是标准 Array 实例,可直接用 map、filter、reduce 等方法;而 arguments 是类数组对象,没有这些方法,且箭头函数里根本不可用。
- ✅ 推荐写法:
const total = (...nums) => nums.reduce((a, b) => a + b, 0); - ❌ 过时写法:
function sum() { return Array.from(arguments).reduce(...); }
常和解构、展开运算符配合使用
剩余参数负责“收”,扩展运算符(同样用 ...)负责“放”,两者语境不同但可联动:
- 解构中用:
const [head, ...tail] = [1, 2, 3, 4];→head是1,tail是[2, 3, 4] - 调用时展开:
Math.max(...[3, 7, 2])相当于Math.max(3, 7, 2) - 组合使用:
const wrapper = (fn, ...args) => fn(...args);











