空值合并运算符(??)仅在左侧为null或undefined时返回右侧操作数,否则返回左侧;它不将0、''、false、NaN等假值视为缺失,而逻辑或(||)会替换所有假值。
JavaScript空值合并运算符(??)用于在左侧操作数为 null 或 undefined 时,返回右侧操作数;否则返回左侧操作数。它和逻辑或(||)看起来功能相似,但关键区别在于“判定为假值”的范围不同。
它不会把其他假值(如 0、''(空字符串)、false、NaN)当作“缺失值”来处理:
0 ?? 10 → 0(因为 0 是有效值,不为 nu
ll/undefined)'' ?? 'default' → ''(空字符串被保留)null ?? 'fallback' → 'fallback'
undefined ?? 'missing' → 'missing'
|| 基于“真值/假值”判断,只要左侧是假值(falsy),就取右侧:
0 || 10 → 10(0 是假值,被替换)'' || 'default' → 'default'(空字符串被替换)false || 'yes' → 'yes'
null || 'n/a' → 'n/a'
假设你从 API 获取用户年龄,可能返回 0(合法年龄)或 null(数据未提供):
??:user.age ?? 18 → 正确保留 0,仅在无数据时回退||:user.age || 18 → 把 0 当作无效,错误回退为 18再比如配置对象中允许空字符串作为有效值:config.title ?? 'Untitled' 不会覆盖空标题,而 config.title || 'Untitled' 会。
?? 的优先级低于 || 和 &&,所以不能直接混用,必须加括号明确意图:
a ?? b || c 等价于 (a ?? b) || c,不是 a ?? (b || c)
a ?? (b || c)
另外,?? 不能与 && 或 || 直接相邻(如 a && b ?? c 会报错),必须用括号包裹任一操作数。