空值合并操作符(??)仅在左侧为 null 或 undefined 时返回右侧默认值,而逻辑或(||)会将所有假值(如 0、''、false)视为无效并替换,默认值语义更严格;适用场景需区分“空值兜底”与“假值过滤”。

JavaScript 中空值合并(??)主要用于处理 null 和 undefined,而逻辑或(||)会把所有“假值”(如 0、''、false)都当作“无效”来处理。所以用 ?? 替代 || 并不是简单替换,而是要明确:你想过滤的到底是“空值”,还是“所有假值”。
空值合并 ?? 的适用场景
当你只希望在变量是 null 或 undefined 时才提供默认值,其他值(包括 0、false、'')都要保留原意,就该用 ??:
-
const count = user.inputCount ?? 10;→ 用户输入0是合法的,不该被替换成10 -
const name = data.name ?? '匿名';→ 只有name真正没定义时才用默认名 -
const config = options?.timeout ?? 5000;→ 安全访问 + 空值兜底,比options?.timeout || 5000更准确
逻辑或 || 的行为陷阱
|| 是“取第一个真值”,它会把所有 falsy 值(0、''、false、null、undefined、NaN)都跳过。这在某些场景下反而出错:
-
const price = item.price || 99;→ 如果item.price是0,结果变成99,价格丢失 -
const isActive = user.status || true;→ 若status是false(表示禁用),却被当成“无状态”而启用 - 这种误判常出现在表单、配置项、API 返回数值等对零值敏感的场景
如何安全迁移:判断意图再替换
不能盲目把所有 || 换成 ??,得先确认业务逻辑是否允许 0、false、'' 等作为有效值:
- 如果默认值仅用于“兜底缺失数据”,且原始值可能为
0/false/''→ 改用?? - 如果确实需要把
0、''等也视为“无效”,继续用||或显式判断:value == null ? default : value - 更严谨的写法可结合类型检查:
(value !== undefined && value !== null) ? value : default
链式与嵌套中的注意事项
?? 和 || 运算符优先级不同,混用容易出错:
-
a ?? b || c等价于(a ?? b) || c,不是a ?? (b || c) - 推荐加括号明确意图:
a ?? (b || c)或(a ?? b) ?? c - 配合可选链
?.使用最自然:user?.profile?.age ?? 18,既防报错又精准兜底
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











