剩余参数(…args)是ES6引入的真数组,用于收集函数末尾多余实参,可直接调用map、filter等方法;arguments是类数组对象,仅存于非箭头函数中且需转换才能使用数组方法。

剩余参数(rest parameters)用法很简单,但容易和 arguments 对象混淆。它用三个点 ... 表示,把函数中多余的实参收集为一个真正的数组,可以放心调用 map、filter、reduce 等方法。
基本写法:放在参数列表末尾
剩余参数必须是函数最后一个形参,前面可以有其他固定参数。
- ✅ 正确:
function sum(a, b, ...nums) { return nums.reduce((s, n) => s + n, a + b); } - ❌ 错误:
function demo(...rest, x) { }(语法报错) - ❌ 错误:
function demo(a, ...rest, b) { }(语法报错)
与 arguments 的关键区别
arguments 是类数组对象,不是 Array 实例;rest 参数是真数组,支持所有数组方法。
-
function old() { console.log(arguments.map(x => x * 2)); }→ 报错:arguments 没有 map 方法 -
function modern(...args) { console.log(args.map(x => x * 2)); }→ 正常运行 - rest 参数不包含已命名的形参,只收“剩下”的;arguments 包含全部传入的实参
常见实用场景
适合处理不定数量参数的函数,比如工具函数、代理封装、日志记录等。
立即学习“Java免费学习笔记(深入)”;
-
合并多个数组:
const concatAll = (...arrays) => arrays.flat(); -
带默认前缀的日志:
const log = (prefix, ...msgs) => console.log(`[${prefix}]`, ...msgs); -
简化事件监听器封装:
const on = (el, event, handler, ...opts) => el.addEventListener(event, handler, ...opts);
注意不能解构赋值时单独使用
rest 不能出现在解构左侧的任意位置,必须是最后一个元素,且不能单独存在。
- ✅
const [first, ...rest] = [1,2,3,4]; - ✅
const { a, ...others } = { a:1, b:2, c:3 }; - ❌
const [...rest, last] = arr;(语法错误) - ❌
const [...rest] = arr;(语法错误,解构中 rest 必须有前置项)


















