解构赋值需逐层设默认空对象防崩:最外层用 data || {} 兜底,嵌套层如 user: { profile = {} } = {} 确保每级非 undefined,因默认值仅对 undefined 生效,null 等需提前清洗。
解构赋值提取深层嵌套对象时,关键不是“写得短”,而是让每一层都扛得住 null、undefined 或字段缺失。真正优雅的写法,是把防御写进结构里,而不是靠一堆 if 判断或可选链前缀。
必须给最外层兜底:obj || {}
对象解构本身不接受 null 或 undefined,否则直接抛 TypeError。所以第一步永远是确保左侧能安全进入解构流程:
-
const { user } = data || {};✅ —— 即使data是null,也不会崩 -
const { user } = data;❌ ——data为null时立即报错
嵌套层级要逐层设默认空对象
只兜最外层还不够。比如想取 user.profile.city,但 user 或 profile 可能为空,就得在每一级嵌套点上加默认值:
-
const { user = {} } = data || {};→ 防user缺失 -
const { user: { profile = {} } = {} } = data || {};→ 防user.profile崩 - 完整写法:
const { user: { profile: { city = 'Unknown' } = {} } = {} } = data || {};
注意:中间的 = {} 不是装饰,是救命的——它让 profile 在为 undefined 时变成空对象,后续才能继续解构 city。
默认值只对 undefined 生效,别被 null 欺骗
这是最容易踩的坑:null、0、false、'' 都不会触发默认值,只有 undefined 才会。
-
const [x = 10] = [null];→x是null,不是10 -
const [x = 10] = [];→x是10(因为索引0对应值为undefined) - 若需处理
null,得先清洗:const cleanData = data === null ? undefined : data;,再解构
函数参数中嵌套解构的防崩写法
把解构写进形参很清晰,但漏掉防御就等于裸奔:
- 错误:
function render({ user: { name } }) { ... }→render({ user: null })直接崩溃 - 正确:
function render({ user: { name = 'Guest' } = {} } = {}) { ... } - 两个
= {}各司其职:外层防undefined参数,内层防user缺失










