Null 是表示“有意缺失的值”的原始值,Nullish Coalescing(??)操作符专用于 null 和 undefined 这两类 nullish 值,为其提供安全默认值,且不干扰 0、false、'' 等有效假值。

JavaScript 中的 Null 是一个原始值,表示“有意缺失的值”;而 Nullish Coalescing(空值合并) 是一个操作符(??),专门用来处理 null 和 undefined 这两类“空缺值”,并提供安全默认值。
Null 和 undefined 都属于 “nullish” 值
在 JS 中,null 和 undefined 被统称为 “nullish” —— 它们代表“没有值”或“未初始化”。其他假值(false、0、''、NaN)虽然也转为布尔 false,但它们是**有明确含义的有效值**,不该被误当作“空缺”来覆盖。
-
null:开发者主动赋的“空” -
undefined:变量声明未赋值、函数无返回、对象无该属性时的默认状态 -
??只对这两者起作用,其余所有值(包括0、false、'')都会原样保留
?? 不是 || 的替代品,而是语义更精确的补充
过去常用 || 设默认值,但它会把所有 falsy 值都当成“需要替换”,容易出错:
-
0 || 100→100(但高度为 0 是合法的!) -
'' || 'N/A'→'N/A'(但空字符串可能是有效输入) -
0 ?? 100→0✅ -
'' ?? 'N/A'→''✅ -
null ?? 'N/A'→'N/A'✅ -
undefined ?? 'N/A'→'N/A'✅
?? 常与 ?.(可选链)配合使用
深层取值 + 默认兜底,是现代 JS 处理不确定数据的黄金组合:
立即学习“Java免费学习笔记(深入)”;
-
user?.profile?.name ?? 'Anonymous':即使user或profile为null/undefined,也不会报错,最终返回名字或默认名 -
config?.timeout ?? 5000:安全读取配置项,没设就用 5 秒 - 比写
config && config.timeout !== undefined ? config.timeout : 5000简洁得多
注意优先级和括号使用
?? 优先级低于算术运算符(如 +、*),但高于赋值(=)和三元(?)。混用时需加括号避免歧义:
- ✅ 正确:
(height ?? 0) * (width ?? 1) - ❌ 错误:
height ?? 0 * width ?? 1(先算乘法,结果可能不是预期)


















