??的核心价值是仅当左侧为null或undefined时才返回默认值,精准保留0、false、''等合法假值;它不参与假值判断,只严格检查空值,避免业务语义错误。

空值合并运算符 ?? 的核心价值,就是只在真正“缺失”时才 fallback——也就是左侧为 null 或 undefined 时才用默认值,而像 0、false、'' 这类合法存在的假值,一律原样保留。
为什么 ?? 能精准保留 0 和 false
它不参与 JavaScript 的“假值判断”,只做两个明确检查:
- 左边是不是
null?是 → 返回右边 - 左边是不是
undefined?是 → 返回右边 - 其他所有情况(包括
0、false、''、NaN)→ 直接返回左边
处理数字 0:避免误覆盖有效数值
比如统计接口返回 { count: 0 },表示“查到 0 条记录”,这本身是有意义的业务状态:
-
const count = data?.count || 10→ 得到10(错误:掩盖了真实零值) -
const count = data?.count ?? 10→ 得到0(正确:0 是有效结果)
同理适用于温度、评分、库存量等可能为 0 的字段。
处理布尔值 false:区分“关闭”和“未设置”
一个用户配置项 autoSave,false 表示“手动保存”,null 才表示“该字段未初始化”:
-
const autoSave = user.settings?.autoSave || true→ 若autoSave是false,也会变成true(语义错乱) -
const autoSave = user.settings?.autoSave ?? true→false保留,null/undefined才 fallback 到true
结合可选链 ?. 使用更安全
嵌套取值时,先用 ?. 防止报错,再用 ?? 填默认值:
-
const theme = user?.preferences?.theme ?? 'light':只要中间任意一环是null或undefined,就用'light' -
const maxRetries = config?.retry?.limit ?? 3:即使limit是0,也如实返回0

















