空字符串在??中为有效值,在||中为假值;??仅对null/undefined取默认值,||对所有假值('',0,false,null,undefined,NaN)取默认值;选哪个取决于空字符串是否代表有效状态。

空字符串在 ?? 中被当作有效值
?? 只关心左侧是否为 null 或 undefined。空字符串 '' 既不是 null 也不是 undefined,所以它会被原样保留,不会触发右侧的默认值。
-
'' ?? 'fallback'→ 返回'' -
undefined ?? 'fallback'→ 返回'fallback' -
null ?? 'fallback'→ 返回'fallback'
空字符串在 || 中被当作假值跳过
|| 会对左侧操作数执行**隐式布尔转换**。空字符串属于 JavaScript 的六大假值(false、0、''、null、undefined、NaN),因此只要左边是 '',就会直接返回右边的值。
-
'' || 'fallback'→ 返回'fallback' -
0 || 'fallback'→ 返回'fallback' -
false || 'fallback'→ 返回'fallback'
选哪个,取决于你对空字符串的语义判断
如果空字符串是你业务中一个合法、有意义的状态(比如用户主动清空了搜索框、表示“不筛选”),就该用 ??;如果空字符串和 null/undefined 一样,都代表“未提供”或“无效输入”,那 || 更合适。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 表单字段允许为空字符串?→
value ?? ''安全保留原始值 - 用户名不能为空,空串等同于没填?→
username || 'Anonymous' - API 返回的 name 字段可能为 '',但你不希望它被默认值覆盖?→ 用 ??
一个小验证技巧
可以快速测试某个值在两种运算符下的行为:
立即学习“Java免费学习笔记(深入)”;
console.log(['', 0, false, null, undefined].map(v => [v ?? 'N', v || 'O']))- 输出会清晰显示:只有
null和undefined在两者下结果一致;其余假值在 ?? 下保留原值,在 || 下都被替换

















