剩余运算符(...)用于函数参数或解构时收集多余值:函数中必须为最后形参,生成数组;数组解构中须在末尾,生成数组;对象解构中生成新对象而非数组,且不可用于开头或中间。

用剩余运算符(...)可以把函数参数或解构时“多出来的”值,一次性收集进一个数组。
函数参数中收集多余参数
在函数定义时,把剩余参数放在最后,前面用正常参数接收确定的值,后面用 ...rest 接收剩下的所有实参:
- 它必须是最后一个形参,否则报错
- 即使没传额外参数,
rest也会是空数组[] - 它不包含已命名的参数,只收集“多出来”的那些
例如:
function sum(first, second, ...others) {return first + second + others.reduce((a, b) => a + b, 0);
}
sum(1, 2, 3, 4, 5); // 返回 15(1+2+3+4+5)
数组解构中提取剩余元素
从数组中解构时,可以用 ...rest 把剩余项打包成新数组:
立即学习“Java免费学习笔记(深入)”;
- 它必须出现在解构模式的末尾,比如
[a, b, ...rest] - 如果原数组不够长,
rest就是空数组 - 不能和普通变量重复,也不能出现在中间或开头
例如:
const arr = [10, 20, 30, 40, 50];const [x, y, ...remaining] = arr;
console.log(x); // 10
console.log(y); // 20
console.log(remaining); // [30, 40, 50]
对象解构中注意:不能直接用于对象剩余属性
对象解构也支持剩余运算符,但它收集的是**未被解构的属性名-值对**,结果是一个新对象,不是数组:
const obj = {a: 1, b: 2, c: 3, d: 4};const {a, b, ...others} = obj;
console.log(others); // {c: 3, d: 4} —— 是对象,不是数组
如果真要转成数组,得手动提取:Object.values(others) 或 Object.entries(others)。
常见误用提醒
- 剩余运算符不是“万能打包”,它只作用于“可遍历”的结构(如数组、类数组、字符串等)
- 不能在对象解构中用
...rest得到数组,它返回的是对象 - 剩余参数/剩余元素必须紧挨着逗号写在最后,不能隔开或重复使用


















