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 返回了新字段、枚举值被后端扩展了。
switch (status) {
case 'success':
handleSuccess();
break;
case 'error':
handleEr
ror();
break;
default:
console.warn('Unknown status:', status); // 关键日志
throw new Error(`Unhandled status: ${status}`);
}
default,遇到未知值就静默跳过,问题难定位default 在中间或开头,容易因漏写 break 导致后续 case 也被执行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 拿到响应就做判断),后续代码就越干净;拖到函数末尾再集中处理,往往意味着状态已经污染、副作用已发生。