对象剩余运算符(...)必须位于解构大括号内最后一个位置,仅适用于对象解构,不可用于数组解构或嵌套解构内部,且不能与已声明属性同名或重复。

对象剩余运算符(...)在解构赋值中不能出现在任意位置,必须是解构模式的**最后一个元素**,且只能用于**对象解构**(不适用于数组解构中的“对象剩余”语义),否则会报语法错误。
必须位于解构模式末尾
剩余属性必须写在解构大括号内的最后,否则 JavaScript 引擎无法确定哪些属性属于“已命名解构”,哪些应归入剩余对象。
- ✅ 正确:
const { a, b, ...rest } = obj; - ❌ 错误:
const { ...rest, a } = obj;→ 报错Rest element must be last element - ❌ 错误:
const { a, ...rest, b } = obj;→ 同样语法错误
不能与同名属性重复或覆盖
剩余运算符收集的是“未被显式解构的自有可枚举属性”。如果某个属性已被前面的解构项声明,它不会出现在 rest 中,但也不会报错;不过若用相同键名多次声明(如解构 + 剩余同时含 a),会引发语法错误。
- ✅
const { a, ...rest } = { a: 1, b: 2, c: 3 };→rest是{ b: 2, c: 3 } - ❌
const { a, a, ...rest } = obj;→ 报错Duplicate data property in object literal not allowed in strict mode
不支持嵌套对象中的“深层剩余”
剩余运算符只作用于当前层级的对象。它不能自动提取嵌套子对象的剩余属性,也不能替代深解构或工具函数。
立即学习“Java免费学习笔记(深入)”;
- ❌ 不能这样写:
const { user: { name, ...userRest }, ...rest } = data;→ 语法错误(剩余不能出现在嵌套解构内部) - ✅ 只能分步:
const { user, ...rest } = data;,再对user单独解构:const { name, ...userRest } = user;
不可用于数组解构中“获取剩余对象”
数组解构的剩余运算符(...)收集的是**剩余元素组成的数组**,不是对象。试图用它获取一个对象会失败,因为类型和语义完全不同。
- ✅
const [first, ...others] = [1, 2, 3];→others是数组[2, 3] - ❌
const [a, ...restObj] = { a: 1, b: 2, c: 3 };→ 无效:右边不是数组,且剩余在数组解构中不产生对象 - ⚠️ 注意:对象解构和数组解构的
...是不同上下文的语法,不可混用语义


















