||设默认值会误判所有假值(0、''、false等),仅当需统一兜底时适用;??则只对null/undefined生效,精准保留合法假值,更安全。

用 || 设置默认值很常见,但容易出错——它不只识别 undefined,所有假值都会触发默认值。
逻辑或(||)怎么设默认值
语法简单:const value = someVar || 'default'。只要 someVar 是假值(false、0、''、null、undefined、NaN),就取右边的默认值。
- 适合快速兜底,比如
const name = userName || '游客' - 也常用于短路赋值:
config.timeout = config.timeout || 5000 - 嵌套属性可用组合写法:
const title = obj && obj.info && obj.info.title || '无标题'
|| 的主要局限性
它按“真假性”判断,不是按“是否缺失”判断,所以会误伤合法的假值数据。
-
0被当成无效值:比如计数器为0,count || 10会返回10,而不是保留0 - 空字符串
''被覆盖:表单输入为空时,inputValue || '请输入'会跳过空值,失去业务意义 -
false也被替换:布尔配置项如isPublic = false,isPublic || true会变成true,逻辑翻转 - 无法区分
null和undefined:两者都触发默认值,但语义不同(一个是“有意清空”,一个是“未定义”)
更安全的替代方案
现代开发中,推荐用更精准的操作符替代 ||。
立即学习“Java免费学习笔记(深入)”;
-
??(空值合并):只在
null或undefined时生效,count ?? 10遇到0或''都保留原值 -
?.(可选链) + ??:安全访问嵌套属性,
user?.profile?.name ?? '匿名'不会因中间某层为null报错 -
严格相等判断:需要精细控制时,显式写
someVar === undefined ? 'default' : someVar
什么时候还能用 ||
它没被废弃,仍有适用场景:
- 你明确希望所有假值都走默认逻辑,比如渲染文案:
message || '暂无内容' - 做布尔兜底且不关心具体值,如
enabled = options.enabled || true(前提是options.enabled确实只可能是true/false/undefined) - 老项目兼容性要求高,需支持 ES2020 之前环境


















