短路求值要求将低成本、高拦截率的条件置于逻辑运算符左侧,以保障执行顺序确定性;需避免隐式 falsy 误判,推荐用具名布尔变量封装语义明确的中间判断,并警惕副作用被跳过。
核心思路是把轻量、高失败率的检查放在逻辑运算符左侧,让高开销操作只在必要时才执行——短路不是技巧,而是执行顺序的确定性保障。
优先安排低成本、高拦截率的前置条件
例如在数据库查询前做参数校验:`id > 0 && id 0` 和 `id
- 对 `&&`:把空值检查、范围校验、状态标记等轻量判断放左边
- 对 `||`:把缓存命中、本地开关启用等高成功率判断放左边
- 避免反模式:`getExpensiveConfig().timeout > 0 && isValid()` —— 前者每次必执行,短路失效
用具名布尔变量封装可读性与复用性
直接堆砌长表达式会降低可维护性。推荐先提取语义清晰的中间判断:
- `const hasValidId = user?.id && typeof user.id === 'number';`
- `const isNotBlocked = user?.status !== 'blocked';`
- 再组合:`hasValidId && isNotBlocked && loadUserProfile(user.id)`
这样既保留短路能力,又让每个条件含义明确,便于单元测试和后续扩展。
警惕隐式 falsy 值带来的误判风险
JavaScript 等语言中,`0`、`''`、`[]`、`{}` 都是 truthy 或 falsy,但业务语义未必一致。比如 `if (items && items.length)` 安全,但 `if (items)` 在 `items = []` 时为 true,可能掩盖空集合问题。
- 数组判空应显式写 `Array.isArray(items) && items.length > 0`
- 字符串非空建议用 `typeof str === 'string' && str.trim() !== ''`
- 对象存在且有关键字段:`user && 'email' in user && user.email`
在 PL/SQL 或 Java 等强类型环境里强化顺序意识
Oracle PL/SQL 明确要求把高概率返回 FALSE 或 NULL 的条件放 AND 左侧,因为一旦左侧为假,右侧函数(如 `credit_ok(cust_id)`)完全不调用。Java 虽无运行时短路优化差异,但编译器强制 `&&` 的语义契约,使这种写法具备可预测性与安全性。
- PL/SQL 示例:
IF cust_id IS NOT NULL AND cust_id > 0 AND credit_ok(cust_id) THEN ... - Java 示例:
if (user != null && user.isActive() && user.hasPermission("EDIT")) - 注意:右侧不能含必须执行的副作用(如日志、计数),否则会被跳过










