空值合并运算符??仅对null和undefined返回右侧默认值,其他值(含0、false、''等)原样保留;常与可选链?.联用处理嵌套空值,优先级低于&&、||但高于=,使用时需注意括号避免歧义,且不能替代类型或业务校验。

空值合并运算符 ?? 专门用来处理 null 和 undefined 这两种“真正空值”的默认值设定,它不会把 0、false、''(空字符串)等“假值”误判为空,这点和逻辑或 || 有本质区别。
只对 null 和 undefined 生效
?? 的左侧操作数如果是 null 或 undefined,就返回右侧的默认值;否则直接返回左侧值。其他所有值(包括 0、false、''、NaN)都会被原样保留。
-
let count = 0 ?? 10;→ 结果是 0(不是 10) -
let isActive = false ?? true;→ 结果是 false -
let name = '' ?? '匿名用户';→ 结果是 '' -
let data = null ?? { id: 1 };→ 结果是 { id: 1 } -
let value = undefined ?? '未设置';→ 结果是 '未设置'
常用于安全读取可选属性
配合可选链 ?. 使用,能优雅地处理嵌套对象中可能不存在的字段。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
-
const city = user?.address?.city ?? '未知城市';—— 如果user为null、address缺失或city为undefined,都返回 '未知城市' - 比
user && user.address && user.address.city || '未知城市'更简洁、更准确
注意运算符优先级和括号使用
?? 的优先级低于 ??=、&&、|| 等,但高于赋值(=)和条件(?:)。混合使用时建议加括号避免歧义。
立即学习“Java免费学习笔记(深入)”;
-
let x = a ?? b + c;等价于a ?? (b + c),不是(a ?? b) + c -
let result = (a ?? 0) > 5 ? 'yes' : 'no';—— 明确意图,推荐加括号 - 不要写
a ?? b || c,因为??和||优先级不同,行为难预测,应写成(a ?? b) || c或按需拆分
不能替代类型检查或业务校验
?? 只解决“空值兜底”,不负责验证数据是否符合业务预期。比如:
-
const age = user.age ?? 18;—— 若user.age是'abc'或-5,也会被原样采用,这未必合理 - 真正需要默认值的场景,建议先做必要判断:
Number.isFinite(user.age) ? user.age : 18 - 和
??搭配的默认值本身也应是安全、可用的值,避免引入新问题

















