优先用if处理比较、类型组合、函数调用等逻辑;switch仅适用于同一变量的严格相等匹配且分支≥3个字面量值;需防穿透、避免switch(true)、对象不可作case;Map/对象字面量更适大量映射。

单一条件或范围判断优先用 if,多个离散、确定值的分支优先用 switch;但现代 JS 中 switch 的适用场景其实比想象中更窄。
什么时候必须用 if?
当判断逻辑涉及比较运算、布尔表达式、函数调用、或类型不一致时,if 是唯一选择:
-
if (x > 10 && y !== null)——switch不支持关系运算符 -
if (typeof data === 'object' && Array.isArray(data))—— 类型组合判断无法用switch拆解 -
if (isValid(input) && hasPermission(user))—— 函数返回值作为条件,switch只能匹配原始值
什么时候 switch 更合适?
仅当所有分支都基于**同一个变量的严格相等(===)匹配**,且分支数量 ≥ 3、值为字符串/数字/布尔字面量时,switch 才有可读性优势:
switch (status) {
case 'pending':
showLoading();
break;
case 'success':
renderResult();
break;
case 'error':
showError();
break;
default:
throw new Error(`Unknown status: ${status}`);
}
注意:case 值是运行时求值的,但只做 === 比较;default 不是可选的——漏掉它容易掩盖未处理状态。
立即学习“Java免费学习笔记(深入)”;
switch 容易被忽略的坑
看似简单,但几个细节常导致逻辑错误:
- 忘记
break→ 会“穿透”执行后续case(哪怕值不匹配),这是最常见 bug 来源 -
switch (true)是反模式:用if/else if更直白,也避免误导他人以为在做值匹配 - 对象或数组不能作为
case值:case { id: 1 }永远不匹配,因为对象比较的是引用 - V8 引擎对
switch的优化仅适用于整数或短字符串;长字符串或 Symbol 分支可能反而比if慢
现代替代方案:Map 和三元链
面对大量固定键值映射(比如状态码转消息),switch 和长 if/else if 都难维护:
- 用
Map:适合动态构建或需要复用的映射逻辑,支持任意键类型(包括对象) - 用对象字面量:
const handlers = { pending: showLoading, success: renderResult }—— 简洁、可枚举、易测试 - 嵌套三元:
type === 'A' ? fnA() : type === 'B' ? fnB() : fnC()—— 仅限 2~3 个分支,过长就失去可读性
真正复杂的条件组合,别硬塞进 if 或 switch,拆成独立函数或状态机更可持续。











