空值合并运算符(??)仅在左侧为null或undefined时返回右侧默认值,不将0、false、''等falsy值视为“空”,与||有本质区别;适用于需保留合法假值的场景。

关键看你想怎么定义“空”:只认 null 和 undefined,就用 ??;只要值在布尔上下文中为假(比如 ""、0、false),就希望 fallback,那就用 ||。
?? 只对 null 和 undefined 响应
它不关心其他“看起来空”的值。只要左侧不是 null 或 undefined,哪怕它是空字符串、数字 0、布尔 false,都会原样返回。
-
data.name ?? "Anonymous"→ 如果data.name === "",结果仍是"" -
config.port ?? 3000→ 如果config.port === 0,结果就是0(端口 0 是合法的) -
user.active ?? true→ 如果user.active === false,结果就是false(明确关闭状态不该被覆盖)
|| 会对所有 falsy 值触发替换
JavaScript 中有 6 种 falsy 值:false、0、-0、0n、""、null、undefined、NaN。只要左边是其中之一,就会取右边。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
input.value || "请输入"→ 用户清空输入框后,input.value是"",所以显示提示 -
settings.debug || false→ 如果settings.debug === 0,也会得到false,可能掩盖真实配置 -
count || 1→ 若count === 0,本意可能是“零个”,结果却变成“一个”,语义出错
怎么选:看业务逻辑是否允许假值存在
如果空字符串、零、false 是有意义的有效状态,必须保留,就该用 ??;如果这些值本质上代表“未设置”或“不可用”,那 || 更合适。
- 表单字段允许留空(
""是合法值)→ 用value ?? "" - 用户没填邮箱,需要强制提示 → 用
email || "请填写邮箱" - API 返回了
{ price: 0 },表示免费 → 用item.price ?? 99保证 0 不被误替换成 99
注意运算符优先级和组合使用
?? 优先级低于 || 和 &&,直接混用会报错。如需组合,必须加括号:
- ✅ 正确:
(a ?? b) || c(先处理空值,再兜底 falsy) - ❌ 错误:
a ?? b || c(语法错误,会抛SyntaxError) - ✅ 安全写法:
a ?? (b || c)(先 fallback 到 b,b 无效时再取 c)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










