对象解构赋值支持重命名、默认值、嵌套解构和动态键名;剩余参数(...rest)可收集未显式声明的自有可枚举属性,需置于解构末尾;二者结合可用于参数分离、部分覆盖合并及敏感字段过滤,但需注意 null/undefined 校验与响应式失效问题。

对象解构赋值:不只是取字段
对象解构赋值最常见的是提取同名属性,但实际支持重命名、默认值、嵌套解构和动态键名。比如:
const { name: fullName, age = 18, address: { city = 'Beijing' } } = user;
这里 name 被重命名为 fullName,age 缺失时取默认值 18,address.city 深层解构也带默认值。注意:嵌套对象本身(如 address)若为 undefined,访问其子属性会报错,所以更安全的写法是加上空值合并:
const { address = {}, address: { city = 'Beijing' } = {} } = user;
剩余参数(...rest)在解构中的妙用
解构时使用 ... 可收集未被显式声明的其余属性,生成一个新对象:
- 必须放在解构模式的最后,否则语法错误
- 收集的是“未被取走”的自有可枚举属性,不包括原型链上的
- 常用于分离配置项与业务数据:
const { id, name, ...options } = { id: 1, name: 'Alice', timeout: 5000, retry: 3 };
此时 options 是 { timeout: 5000, retry: 3 }
解构 + 剩余参数组合实战技巧
二者结合能写出简洁灵活的函数参数处理逻辑:
- 函数接收对象参数并分离核心字段与扩展配置:
function createUser({ username, email, ...config }) {
return { username, email, ...config, createdAt: new Date() };
} - 配合解构默认值实现“部分覆盖”式合并:
const defaults = { theme: 'light', lang: 'en' };
const userPrefs = { lang: 'zh' };
const { theme, lang, ...rest } = { ...defaults, ...userPrefs }; // theme='light', lang='zh', rest={} - 避免手动遍历 keys,快速过滤掉某些字段:
const { password, token, ...safeUser } = userData;(剔除敏感字段)
注意事项与边界情况
这些高级用法虽强大,但需留意几个易错点:
- 解构 null 或 undefined 会直接抛出 TypeError,务必提前校验或用空对象兜底:
const { a, b } = obj || {}; - 剩余参数不会继承原型方法,得到的是纯数据对象;若需保留原型行为,不能依赖 ... 收集
- 计算属性名解构暂不支持(如 { [key]: value }),只能用于赋值右侧,不能用于左侧解构模式
- Vue/React 中对解构后的响应式对象属性赋值不会触发更新,因为解构后已脱离响应式代理










