解构赋值不处理null或undefined,会直接抛TypeError;必须先兜底确保右侧为数组或对象(如arr ?? []、obj ?? {}),再解构;默认值仅对undefined生效,对null无效;深层嵌套需逐层兜底或单行嵌套解构;函数参数解构须加整体默认值{}。

解构赋值本身不处理 null 或 undefined——遇到就直接抛 TypeError,根本不会走到默认值逻辑。避免报错的关键不是“改写法”,而是提前把危险值挡在解构门外。
先兜底再解构:最直接有效的做法
右侧值必须是数组或对象,否则解构失败。所以第一步永远是确保它“可解构”:
- 数组解构前用
Array.isArray(arr) ? arr : []或更通用的Array.from(arr) ?? [] - 对象解构前统一转成对象:
obj || {}或obj ?? {} - 如果来源是 API 响应、localStorage 或表单字段,这类兜底不能省略
默认值只防 undefined,不防 null 和整体缺失
很多人误以为写了 a = 'default' 就万事大吉,其实它只在 a 对应位置的值是 undefined 时生效:
-
const [a = 'x'] = null→ 报错(整个右边是null,没机会进解构) -
const [a = 'x'] = []→a === 'x'(空数组,索引 0 是undefined) -
const [a = 'x'] = [null]→a === null(null不触发默认值) - 要让
null也走默认值,得先转换:const [a = 'x'] = arr ?? []
深层嵌套结构需分层设防
像 user?.profile?.address?.city 这种链式访问可以用可选链,但解构不支持 ?.。想安全解构多层嵌套,有两种常用方式:
立即学习“Java免费学习笔记(深入)”;
- 逐层兜底解构:
const { profile = {} } = user || {};const { address = {} } = profile;const { city = 'Unknown' } = address; - 单行嵌套解构(语法紧凑但可读性稍弱):
const { profile: { address: { city = 'Unknown' } = {} } = {} } = user || {};
函数参数解构要加整体默认值
函数接收配置对象时,解构参数很常见,但漏掉顶层兜底会立刻崩溃:
- ❌ 错误:
function init({ timeout = 3000 }) { ... }→ 调用init(undefined)直接报错 - ✅ 正确:
function init({ timeout = 3000 } = {}) { ... }→= {}挡住undefined和null - 配合可选链和空值合并更稳妥:
function log({ level = 'info', message } = {}) { ... }


















