展开语法与剩余参数作用相反:展开语法(...arr)用于“拆”数组/对象,实现函数调用、合并、浅拷贝等;剩余参数(function(...args))用于“收”多余实参,必须位于形参末尾,生成真数组。

展开语法和剩余参数都是 ES6 引入的三个点(...)语法,但作用相反、位置不同——一个“拆”,一个“收”。
展开语法:把数组或对象“摊开”
展开语法用在已有数组、对象或可迭代值之前,把它里面的元素逐个取出,用于函数调用、构造新数组/对象等场景。
-
传参更简洁:替代
apply(),比如Math.max(...[1, 5, 3])直接得到5 -
合并数组不需 concat():例如
[...arr1, ...arr2, 99]快速拼接 -
浅拷贝数组或对象:写成
[...oldArr]或{...oldObj},比slice()或Object.assign()更直观 -
解构时插入片段:如
const newArr = [0, ...mid, 100],把中间数组展开插进去
剩余参数:把多余参数“收进数组”
剩余参数用在函数定义的参数列表末尾,把调用时多出来的那些参数自动聚合成一个真数组。
-
必须放在参数最后:例如
function fn(a, b, ...rest)合法;function fn(...rest, a)报错 -
得到的是 Array 实例:可直接调用
map、filter、reduce等方法,不用再转Array.from(arguments) -
和普通参数配合使用:比如日志函数
log(level, ...msgs),固定取第一个参数为级别,其余全当消息内容 -
解构中也能用:如
const [first, ...others] = [1, 2, 3, 4],others就是[2, 3, 4]
关键区别一眼分清
只看三点:位置、方向、用途。
-
位置:展开语法在值前面(
func(...arr)/[...arr]);剩余参数在形参最后(function(...args)) - 方向:展开是“向外发散”,把集合拆成独立项;剩余是“向内收敛”,把多个项收成一个数组
- 用途:展开解决“怎么把结构里的东西拿出来用”;剩余解决“怎么接住不确定数量的输入”
常见误用提醒
两者写法一样,但放错地方就出错:
- 不能在函数调用时写
fn(...)却不跟任何值——...后面必须有可迭代对象 - 剩余参数只能有一个,且不能出现在默认参数之后
- 箭头函数里同样支持剩余参数,比如
(a, b, ...rest) => rest.length - 字符串也可被展开:
[...'hi']得到['h', 'i'],因为字符串是可迭代的
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











