解构 null 或 undefined 会抛 TypeError,应通过 || {} 或 ?? {} 提供安全空对象兜底;嵌套解构需逐层设防或用可选链+空值合并;环境变量需 ?? {} 防御并清洗字符串假值。

直接解构 null 或 undefined 会立即抛出 TypeError: Cannot destructure property 'x' of 'y' as it is null/undefined。关键不是避免解构,而是让解构操作有“安全落点”——即确保右侧始终是一个可解构的对象。
用空对象兜底是最常用且有效的做法
在解构前用逻辑运算符 || {} 或空值合并 ?? {} 提供默认对象,把 null 和 undefined 归一化为安全的空对象:
-
const { name, age } = user || {};——user是null、undefined或假值时都生效 -
const { name, age } = user ?? {};—— 更精准,只对null和undefined生效,0、false、''等仍保留原值 - 注意:不能只写
const { name } = user;,哪怕你加了默认值name = '游客',只要user本身是null就已报错
嵌套解构必须逐层设防
深层结构如 user.profile.avatar 容易因中间某层为空而崩,不能只靠顶层兜底:
- 错误:
const { avatar } = user?.profile || {};—— 若user是null,user?.profile得undefined,|| {}能兜住,但可读性差、易漏 - 推荐写法:
const { profile = {} } = user || {};,再const { avatar = '/default.png' } = profile; - 或一步到位:
const { profile: { avatar = '/default.png' } = {} } = user || {};
配合可选链与空值合并更简洁
对于单个字段提取,尤其带默认路径的场景,可选链(?.)+ 空值合并(??)组合比解构更轻量、更直观:
const name = user?.name ?? '匿名';const avatar = user?.profile?.avatar ?? '/default.png';- 这种写法不依赖对象结构完整性,也不触发解构语法检查,天然规避
null/undefined报错
环境变量或配置对象要额外留意类型
像 process.env 或构建注入的 window.CONFIG,表面是对象,但可能被覆盖为 null 或 undefined:
- 安全写法:
const { API_URL = 'https://api.dev', TIMEOUT = 3000 } = process.env ?? {}; - 若字段值可能是字符串
'null'或'undefined',需额外清洗:API_URL === 'null' ? undefined : API_URL - TypeScript 用户建议配
Record类型,增强编译期提示











