对象解构中剩余操作符(...)用于收集未显式提取的自身可枚举属性并打包为新对象,必须置于解构左侧大括号末尾,可与重命名、默认值共存,不收集原型属性、不修改原对象。

对象解构中用剩余操作符(...)收集其余属性,核心是用 { a, b, ...rest } 语法把未显式提取的属性打包成一个新对象。
剩余操作符必须放在最后
剩余变量只能出现在解构左侧的大括号末尾,否则语法报错:
- ✅ 正确:
const { name, age, ...others } = { name: 'Lily', age: 28, city: 'Shanghai', job: 'Engineer' };
→name === 'Lily',age === 28,others === { city: 'Shanghai', job: 'Engineer' } - ❌ 错误:
const { name, ...others, age } = obj;(会报 SyntaxError)
可与重命名、默认值共存
剩余操作符不干扰其他解构特性,可以混合使用:
- 重命名 + 剩余:
const { name: userName, ...rest } = { name: 'Tom', id: 101, role: 'admin' };
→userName === 'Tom',rest === { id: 101, role: 'admin' } - 默认值 + 剩余:
const { status = 'active', ...meta } = { id: 5, createdAt: '2026-10-01' };
→status === 'active'(因原对象无status),meta === { id: 5, createdAt: '2026-10-01' }
注意:不包含原型属性,也不修改原对象
剩余操作符只收集对象自身的可枚举属性:
- 不会收集继承来的属性(比如从
Object.prototype上来的toString) - 不会触发 setter,也不会给原对象添加或删除任何属性——纯读取行为
- 如果原对象有 Symbol 属性,且是可枚举的,也会被收集进
...rest
常见用途示例
适合需要“主字段 + 其他元数据”分离的场景:
- 函数参数过滤:
function createUser({ name, email, ...options }) { /* 只处理 name/email,其余传给内部配置 */ } - 组件 props 解构:
const { className, children, ...props } = this.props;(React 中常用于透传 HTML 属性) - API 响应清洗:
const { code, message, data, ...debugInfo } = response;











