JavaScript中&&、||、??均具短路特性:&&遇假值即返左且不执行右;||遇真值即返左且跳过右;??仅当左为null或undefined时才取右,0/''/false等仍视为有效。

JavaScript 中的 &&、|| 和 ?? 都具备短路特性,但作用机制和适用场景不同:&& 在左侧为假值时停止执行并返回该值;|| 在左侧为真值时立即返回它;?? 则只在左侧为 null 或 undefined 时才取右侧。它们不是“返回布尔值”的工具,而是“返回原值 + 控制执行流”的关键语法。
&& 的短路:左边一假,右边不碰
表达式 a && b 从左到右求值,只要 a 是 falsy(false、0、""、null、undefined、NaN),就直接返回 a,b 完全不执行。
- 防止报错:
user && user.profile && user.profile.name中,任一环节为null或undefined,后续属性访问就被跳过 - 条件执行:
isLoggedIn && fetchDashboard()只有登录成功才发起请求 - 注意陷阱:
0 && doSomething()返回0,doSomething不调用——这很安全,但别误以为0是“无效数据”而粗暴用||覆盖
|| 的短路:左边一真,右边作废
a || b 同样从左到右,一旦 a 是 truthy,立刻返回 a,b 不计算。
- 设默认值:
config.timeout || 5000—— 只要config.timeout有值(哪怕为0或false),就用它;只有它是 falsy 才 fallback - 兜底容错:
localStorage.getItem("theme") || "light" - 风险提示:
0 || 10得10,但0可能是合法的配置项;此时用??更准确
?? 的短路:只认 null/undefined,其他照单全收
??(空值合并)是 ES2020 新增运算符,它的短路逻辑更精准:仅当左侧为 null 或 undefined 时,才返回右侧;0、false、"" 等 falsy 值均视为有效,直接返回。
- 替代 || 的模糊默认:
count ?? 10——count是0时仍用0,不是10 - 配合可选链:
user?.profile?.age ?? 18,既防空指针,又保语义准确 - 不可与 &&/|| 混用优先级:
a && b ?? c会报错,需加括号:a && (b ?? c)
怎么选:看你要过滤什么
判断依据不是“真假”,而是“是否代表缺失”:
- 用 && 当你需要“前置条件成立才继续”(如权限检查、对象存在性)
- 用 || 当你接受所有 falsy 值都算“无配置”,统一 fallback(适合快速原型或宽松场景)
- 用 ?? 当你只把
null/undefined视为“未设置”,其余值(包括0、false)都要保留(生产环境推荐)











