空值合并运算符(??)仅在左侧为null或undefined时使用右侧默认值,不将0、false、''视为“空”,与||有本质区别;适用于变量合法取值包含假值但仅缺失时fallback的场景。
空值合并运算符(
)只在左侧为
或
时才使用右侧默认值,它不会把
、
、
(空字符串)当作“空”来处理——这点和逻辑或
有本质区别。
什么时候该用
而不是
当你的变量可能合法地取到
、
、
,但你只想在真正缺失(
/
)时 fallback,默认值才适用
。
—— 如果 API 返回
,结果是
,不是
—— 若
是
,仍保留
;只有字段根本不存在或为
才用
误用
:
在
时也会 fallback 到
,这通常不符合业务语义
的优先级和链式写法要注意括号
优先级低于
和
,直接混用会出错。想组合判断时必须加括号,否则 JS 会按默认优先级解析。
❌ 错误:
等价于
,不是你想表达的 “a 为空则取 (b && c)”
✅ 正确:
或
,按需明确分组
链式默认值安全:
—— 可连续
,从左到右第一个非 null/undefined 值即返回
和可选链
搭配是最常见也最易出错的场景
很多人以为
能覆盖所有“访问不到”的情况,但它其实只防
为
/
,不防
存在但
是
—— 这恰恰是
生效的条件。
Find JSON Path Online
Easily find JSON paths within JSON objects using our intuitive Json Path Finder
下载
立即学习
“
Java免费学习笔记(深入)
”;
✅ 安全组合:
—— 即使
或
是
/
,也不会报错;若
是
,就用默认值
⚠️ 注意:如果
是一个对象,但
属性压根没定义(
检查为
),读出来就是
,此时
依然生效
❌ 不要写成
—— 当
或
,你会意外丢失原始值
真正容易被忽略的是嵌套结构中某一层存在但值为
的情况:它既不是运行时错误(所以
不拦截),又触发
,但开发者常误以为那是“数据没传过来”,其实只是后端显式设了
(虽然 JSON 里没有
,但 JS runtime 中可能出现)。遇到奇怪的默认值覆盖,先 console.log 看清原始值类型。
??nullundefined0false''||??||0false''nullundefined??const count = response?.data?.count ?? 10;{data: {count: 0}}010const isActive = user?.active ?? true;user.activefalsefalsenulltrue||user?.age || 25age === 025????&&||a ?? b && c(a ?? b) && ca ?? (b && c)(a ?? b) && cobj?.x?.y ?? obj?.fallback ?? 'default'???. obj?.prop ?? 'default'objnullundefinedobjpropundefined??user?.profile?.name ?? 'Anonymous'userprofilenullundefinednameundefineduser.profilenameinfalseundefined??user?.profile?.name || 'Anonymous'name === ''0undefined?. ??undefinedundefined