布尔值应源自条件表达式而非硬编码,如const isAdult = user.age >= 18;善用&&/||短路特性安全取值或设默认值;避免多层否定与复杂三元表达式,优先具名化条件并注意falsy边界值。

布尔值不是开关,是条件表达式的自然结果
直接给变量赋 true 或 false 很少是最佳实践。真正有用的是让布尔值从比较或函数调用中“冒出来”——比如 user.age >= 18 返回 true,Array.isArray(data) 返回 false。这样得到的布尔值自带语义和上下文,后续逻辑才不容易脱节。
常见错误是写成:const isAdult = true; if (isAdult) { ... }——这等于硬编码分支,失去判断意义。应该写成:const isAdult = user.age >= 18; if (isAdult) { ... }
用 && 和 || 替代冗长的 if-else 嵌套
&& 不只是“且”,它会返回第一个假值(falsy)或最后一个操作数;|| 返回第一个真值(truthy)或最后一个操作数。这个特性常被用来做短路控制:
-
user && user.profile && user.profile.avatar可安全取深层属性,任一环节为null或undefined就停止,不报错 -
inputValue || 'default'提供默认值,比inputValue ? inputValue : 'default'更简洁 -
isValid && submitForm()等价于if (isValid) submitForm(),但只适用于无返回值的副作用操作
注意:&& 和 || 的返回值不一定是布尔型,它们返回的是操作数本身(如字符串、对象、0、''),这点容易在类型敏感场景(如 TypeScript)中引发隐式类型问题。
避免用 ! 多层否定制造认知负担
像 !(!isLoading && !hasError) 这种写法,既难读又易错。优先把条件提前具名化:
const shouldDisplayContent = isLoading === false && hasError === false;
if (shouldDisplayContent) { ... }
或者更进一步,用德·摩根定律简化:!(isLoading || hasError) ——但前提是团队熟悉该规则。否则宁可多写一行注释,也不靠脑内反转。
特别警惕 !value 对非布尔值的隐式转换: !0 是 true,![] 是 false,!{} 是 false。不确定时,显式转布尔:Boolean(value) 或 !!value(后者更常见但需确认团队接受)。
三元运算符里别塞复杂布尔表达式
三元运算符本为提升可读性,但写成这样就适得其反:
status === 'active' && user.role !== 'guest' ? renderAdminPanel() : renderGuestView()
应拆解为:
const canAccessAdmin = status === 'active' && user.role !== 'guest'; return canAccessAdmin ? renderAdminPanel() : renderGuestView();
好处有三:调试时能直接看 canAccessAdmin 的值;逻辑复用方便(比如后续还要判断是否显示编辑按钮);单元测试更容易覆盖分支。
真正容易被忽略的是:布尔逻辑的“边界案例”往往不在 true/false,而在 null、undefined、0、'' 这些 falsy 值上。比如 if (user.id) 在 id=0 时跳过,可能漏掉合法用户。这时候必须明确比较:if (user.id !== undefined) 或 if (Number.isInteger(user.id))。

















