剩余运算符(...)用于收集函数中未被单独声明的多余参数并形成真数组,必须位于参数列表末尾且唯一;它替代arguments但更强大,支持箭头函数和数组方法,还可用于数组解构。

JavaScript 中的剩余运算符(...)用三个点表示,专门用来收集函数中未被单独声明的多余参数,形成一个真正的数组。
基本用法:放在参数列表末尾
剩余参数必须是函数参数列表中的最后一个,且只能有一个。它会把调用时传入的、超出前面已命名参数个数的所有实参,自动打包成一个数组。
- 写法:function fn(a, b, ...rest) { }
- ...rest 不是数组字面量,而是语法标记,表示“把剩下的都放这里”
- 调用 fn(1, 2, 3, 4, 5) 时,a = 1,b = 2,rest = [3, 4, 5]
和 arguments 的区别
剩余参数替代了传统 arguments 对象的部分用途,但更简洁、更强大:
- arguments 是类数组对象,没有 map、filter 等数组方法;...rest 是真数组,可直接调用所有数组方法
- arguments 包含所有实参(包括已命名的),而 ...rest 只收集“多余的”那部分
- arguments 在箭头函数中不可用;...rest 在箭头函数中完全支持
常见使用场景
- 封装可变参数函数:比如实现自己的 sum(...nums),直接 nums.reduce((a, b) => a + b, 0)
- 参数预处理后转发:如日志函数 log(prefix, ...args),内部用 console.log(prefix, ...args) 展开传递
- 解构时收尾:在数组解构中也能用,例如 const [first, second, ...others] = [1, 2, 3, 4, 5]; → others 得到 [3, 4, 5]
注意点
- 不能放在默认参数之后,比如 function f(a = 1, ...rest) {} 是合法的,但 function f(...rest, a) {} 会报错
- 如果调用时没有多余参数,...rest 仍会存在,值为空数组 []
- 剩余参数不捕获命名参数的 undefined 值——它只看实参个数,不是看是否传了值


















