JavaScript条件语句本身不控制流程,真正影响流程的是if/else/switch结构及其中的return、break、continue或异常;布尔判断、范围比较、函数调用必须用if,switch仅支持严格相等匹配。

JavaScript 条件语句本身不“控制流程”——它只是根据表达式真假,决定执行哪一段代码;真正影响流程走向的是你写的 if、else if、else、switch 结构和其中是否包含 return、break、continue 或异常抛出。
什么时候用 if 而不是 switch
当判断依据是布尔表达式、范围比较(如 age >= 18)、或需要调用函数得出结果时,必须用 if。而 switch 只做严格相等(===)匹配,且只接受原始值或字符串作为 case 值。
-
switch遇到case 0:不会匹配false或空数组,因为不进行类型转换 - 多个
case想共享逻辑,得显式写break,漏掉就会“穿透”,这是最常见 bug 来源 - 如果判断逻辑含
user.role === 'admin' || user.permissions.includes('delete'),只能写在if里
if 中的真值与假值陷阱
JavaScript 会把非布尔值自动转为布尔上下文,但 0、''、null、undefined、NaN、false 全部是假值——哪怕 '' 是合法字符串,0 是有效数字。
- 检查对象属性是否存在,别直接写
if (obj.name),因为name可能是''或0,该显示却跳过了 - 更安全写法是
if ('name' in obj)或if (obj.hasOwnProperty('name'))(注意原型链) - 想确认变量已定义且非空,用
if (obj?.name != null)(可选链 + 非空检查)
switch 的 default 必须写,且最好放在最后
即使你认为所有情况都覆盖了,也要加 default。它不只是“兜底”,更是调试线索:一旦进入 default,说明有未预期值出现,比如 API 返回了新字段、枚举值被后端扩展了。
立即学习“Java免费学习笔记(深入)”;
switch (status) {
case 'success':
handleSuccess();
break;
case 'error':
handleError();
break;
default:
console.warn('Unknown status:', status); // 关键日志
throw new Error(`Unhandled status: ${status}`);
}
- 不写
default,遇到未知值就静默跳过,问题难定位 - 如果
default在中间或开头,容易因漏写break导致后续case也被执行 - 某些 Linter(如 ESLint)会强制要求
default存在,不是为了形式,是防错
嵌套太深?试试提前 return 或卫语句
三层以上 if 嵌套会让逻辑难以阅读和测试。与其写 if (a) { if (b) { if (c) { ... } } },不如把否定条件提前处理。
function processOrder(order) {
if (!order) return; // 卫语句
if (order.status !== 'pending') return;
if (!order.items?.length) return;
// 此处才处理主逻辑,缩进减少,意图清晰
chargePayment(order);
updateInventory(order);
}
- 提前
return不等于“不处理错误”,而是把边界条件隔离出来 - 避免
else块包裹大片业务逻辑,那会让核心路径被掩盖 - 如果函数必须返回值,卫语句可用
return null或return Promise.resolve()等明确占位
条件分支越靠近数据源头(比如刚从 API 拿到响应就做判断),后续代码就越干净;拖到函数末尾再集中处理,往往意味着状态已经污染、副作用已发生。











