解构赋值中只有 undefined 触发默认值,null 不触发,因 null 是明确赋值的“有意留空”;数组解构同理,空位或显式 undefined 才启用默认值,null 直接赋值;需手动用 ?? 修正 null 场景。

解构赋值中,undefined 和 null 的行为完全一致:只有 undefined 会触发默认值,null 不会。这和函数默认参数的规则一模一样——不是看“空不空”,而是看“是不是真的没给值”。
为什么 null 不触发默认值?
null 是一个明确赋的值,代表“我有意留空”。解构时只要右侧对应位置是 null,就照收不误,不会退而求其次用默认值。
-
✅ 未提供(undefined)→ 触发默认值:
const { name = '匿名' } = {};→name是'匿名' -
✅ 显式传 undefined → 触发默认值:
const { name = '匿名' } = { name: undefined };→name还是'匿名' -
❌ 传 null → 不触发,默认值被跳过:
const { name = '匿名' } = { name: null };→name就是null
数组解构也一样
数组解构的空位天然是 undefined,所以默认值只对“空位”或显式 undefined 生效,对 null 无效。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
-
const [a = 'a', b = 'b'] = [null];→a是null,b是'b' -
const [a = 'a'] = [];→a是'a'(因为第一个位置是 undefined) -
const [a = 'a'] = [undefined];→a也是'a'
想让 null 也走默认逻辑?得手动处理
解构本身不支持对 null 做特殊判断,但你可以结合空值合并操作符 ?? 或三元运算符后置修正:
- 解构后修正:
const { name } = obj; const finalName = name ?? '默认名'; - 一行写法(推荐):
const { name } = obj; const displayName = name ?? '默认名'; - 注意别用
||,它对0、''、false也会生效
语义上要分清:undefined 是“没给”,null 是“给了个空”
解构设计本意就是尊重开发者意图:如果结构里明确写了 null,说明你就是想让它空着;如果是真没提供(undefined),才帮你兜底。这种区分不是 bug,是刻意为之的设计逻辑。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










