短路或(||)用于布尔判断和默认值设置,左侧为假值时才计算右侧;按位或(|)用于整数二进制位运算,左右操作数均会计算。

短路或(||)和按位或(|)虽然都用“或”字,但作用完全不同,用错会导致逻辑错误或性能问题。
短路或 || 用于布尔判断和默认值设置
它只在左侧为假值(false、0、''、null、undefined、NaN)时才计算右侧表达式,否则直接返回左侧值。这个“短路”特性常用来做条件判断或提供默认值。
- 判断变量是否存在并赋默认值:
const name = user.name || '匿名用户'; - 避免访问空对象属性报错:
if (obj && obj.data || obj.status === 'ok') { ... }(注意:这里&&也短路) - 函数调用前检查依赖:
config?.timeout || 5000(配合可选链更安全)
按位或 | 用于整数的二进制位运算
它把两个操作数转成32位有符号整数,然后逐位进行或运算(只要有一位是1,结果该位就是1)。不短路,左右两边都会计算。
- 合并权限标志位:
const READ = 1; const WRITE = 2; const PERM = READ | WRITE; // 结果是 3 - 快速取整(仅对非负数有效):
3.7 | 0 // 得 3(原理是转整数再按位或,但不推荐替代Math.floor) - 颜色值组合:
const rgb = (r
别把 || 当成 | 用,也别用 | 替代 ||
它们类型和语义都不兼容。比如:0 || 5 返回 5(逻辑值),而 0 | 5 返回 5(整数),看似一样,但换成 false || 'hello' 是 'hello',而 false | 'hello' 会先转数字变成 0 | NaN → 0,结果完全不同。
- 需要布尔逻辑、默认值、条件跳过 → 用 ||
- 需要操作二进制位、组合标志、整数运算 → 用 |
- 不确定时,优先写清楚意图:比如用
??处理 null/undefined 默认值,比||更精准
实际开发中怎么选
看上下文目标。大多数日常判断(表单校验、配置兜底、状态合并)都该用 ||;只有涉及底层数据结构、协议解析、图形/音视频处理、权限掩码等场景,才需要 |。
- 字符串、对象、null/undefined 参与的判断 → 只能用 ||(| 会强制转数字,易出错)
- 两个明确的正整数做位组合 → 用 | 更高效、语义更准
- 想兼容 null/undefined 但又不想把 0 或 '' 当假 → 改用空值合并操作符
??

















