ES6解构中的...是剩余参数语法,用于收集未被单独命名的剩余元素或属性:数组中收集为新数组,对象中收集为新对象,必须位于解构左侧末尾,且不包含原型属性或不可枚举属性。

ES6 扩展运算符(...)在解构中实际起作用的是剩余参数(rest)语法,它不是“扩展”,而是“收集”——把解构后剩下的属性或元素收进一个新数组或对象里。关键在于位置和上下文:当 ... 出现在解构赋值的左侧末尾时,它就是剩余收集操作。
数组解构中的剩余元素收集
用 ... 收集数组中未被单独命名的其余项,结果始终是数组:
-
const [a, ...rest] = [1, 2, 3, 4];→a === 1,rest === [2, 3, 4] -
const [x, y, ...z] = ['a'];→x === 'a',y === undefined,z === [](空数组,不会报错) - 剩余部分必须放在最后,
const [...first, last] = arr;是语法错误
对象解构中的剩余属性收集
同样适用于对象,... 收集未显式列出的其余自有可枚举属性:
-
const { name, age, ...others } = { name: 'Alice', age: 30, city: 'Beijing', job: 'Engineer' };→others是{ city: 'Beijing', job: 'Engineer' } - 剩余对象不包含原型链上的属性,也不包含不可枚举属性
- 不能与同名变量重复声明:
const { id, ...id } = obj;会报错
常见注意事项
使用剩余收集时容易忽略但影响行为的细节:
- 右侧必须是可迭代对象(数组)或普通对象;对
null或undefined解构会报错,建议先做兜底:const { a, ...rest } = data || {}; - 剩余收集不触发 getter,只复制当前属性的值(浅拷贝)
- 嵌套解构中也能用剩余:
const { user: { name, ...userRest }, ...rest } = data; - 剩余语法与扩展运算符写法相同,但语义相反:左侧收集、右侧展开
掌握这个模式,能让你干净地分离核心字段和附加信息,尤其适合处理 API 返回的富对象或函数参数透传场景。


















