?? 仅在左侧为 null 或 undefined 时取右侧值,保留 0、''、false 等有效假值;|| 在任意假值(false、0、''、null、undefined、NaN)时均取右侧值;二者触发条件与语义意图截然不同。

本质不同在于:?? 只在左侧是 null 或 undefined 时才用右侧值;|| 只要左侧是任意“假值”(false、0、''、null、undefined、NaN)就换右侧值。
?? 保留有效假值,|| 一概跳过
很多业务场景中,0、空字符串 ''、false 是合法且有意义的值。比如配置项 timeout: 0 表示“不超时”,用户输入 name: '' 可能表示“暂不填写”。这时:
-
config.timeout ?? 5000→ 返回0(正确保留原意) -
config.timeout || 5000→ 返回5000(错误覆盖了有效设置) -
user.name ?? '匿名'→ 若user.name === '',返回'' -
user.name || '匿名'→ 同样是'',却返回'匿名'
触发条件完全不同
判断逻辑不是“真假”,而是“是否真正缺失”:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
-
??的判断标准非常窄:仅null和undefined被视为“空” -
||的判断基于 JavaScript 的“假值列表”,共 6 种:false、0、-0、0n、''、null、undefined、NaN - 像
NaN ?? 'fallback'会返回NaN,而NaN || 'fallback'一定返回'fallback'
优先级和组合使用要注意
?? 的运算符优先级高于 ||,但低于大多数算术和比较运算符。混合使用时容易出错:
-
a ?? b || c等价于(a ?? b) || c,不是a ?? (b || c) - 如果想表达“a 为空则取 b 或 c 中第一个真值”,必须加括号:
a ?? (b || c) - 常见误写:
value ?? defaultValue || ''实际是(value ?? defaultValue) || '',可能多一层不必要的 ||
选哪个,关键看你的默认意图
一句话决策指南:
- 你想说:“这个值要是根本没设(null/undefined),我才给默认值” → 用
?? - 你想说:“这个值只要‘不顶用’(任何假值),我就换一个” → 用
|| - 典型搭配:
?.??(可选链 + 空值合并)处理深层属性默认值,比如user?.profile?.age ?? 18

















