空值合并操作符(??)仅在左侧为null或undefined时使用右侧值,而||对所有假值(0、false、''、null、undefined、nan)均生效;??与?.配合可安全处理嵌套对象的空值。

空值合并操作符(??)只在左侧值为 null 或 undefined 时,才使用右侧的默认值;其他“假值”(比如 0、false、'')都会被原样保留。
它和逻辑或(||)的区别在哪
|| 是“真值判断”,遇到任何假值(0、false、''、null、undefined、NaN)就用右边值;?? 是“空值判断”,只对 null 和 undefined 敏感。
-
0 ?? 10→0(0不是空值,不替换) -
0 || 10→10(0是假值,被替换) -
'' ?? 'default'→''(空字符串有效,保留) -
null ?? 'default'→'default' -
undefined ?? 'default'→'default'
常见使用场景
适合明确区分“未设置”和“已设置但为零/空”的情况。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 配置项:用户没传
timeout(undefined),才用默认值;但传了0表示“不超时”,不能覆盖 - 接口返回字段:后端可能返回
null表示缺失,但0是合法数值(如库存为 0) - 解构赋值时设默认值:
const { count = 0 } = obj是解构默认值,而obj.count ?? 0是运行时安全取值
链式与优先级注意点
?? 的优先级低于 ?.(可选链),但高于 = 和 ,,且**不能直接跟在 && 或 || 后面**,否则会报错。
- ✅ 正确:
obj?.prop ?? 'default' - ✅ 正确:
(a ?? b) || c(加括号明确顺序) - ❌ 错误:
a ?? b || c(语法错误,必须加括号) - ⚠️ 注意:
??从左到右结合,a ?? b ?? c等价于(a ?? b) ?? c
和可选链(?.)配合最实用
处理深层嵌套对象中可能为空的字段,既避免报错,又不误判有效假值。
-
user?.profile?.age ?? 18:如果user或profile为null/undefined,整个表达式为undefined,触发??;如果age是0,就用0 - 比
user && user.profile && user.profile.age || 18更简洁、语义更准
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










