switch适用于单个表达式严格相等、分支超3个且值为静态常量的场景;if用于范围判断、逻辑组合、动态条件等switch无法处理的情况。

if 和 switch 不是“选哪个更好”,而是“在什么场景下必须用哪个”——选错会导致逻辑难维护、性能掉坑、甚至隐藏 bug。
什么时候必须用 switch?
当判断目标是**单个表达式的严格相等(===)结果,且分支超过 3 个、值为静态常量(数字、字符串、Symbol)时,switch 更安全、更易读、也更容易被 JS 引擎优化。
- 常见误用:
switch里写case x > 5:—— 这根本不会按预期执行,因为case只做===匹配,不支持条件表达式 - 正确写法:所有
case必须是字面量或常量,例如case "loading":、case 404: - 别忘了
break;漏写会导致“穿透”,多个分支连续执行——这是线上 bug 高发区 - 默认分支
default建议放在最后,但不是语法强制;如果逻辑上存在“未覆盖情况”,必须显式处理,不能靠注释代替
什么时候只能用 if?
if 是通用判断容器,switch 做不到的,基本都得靠它。
- 判断范围:比如
if (age >= 18 && age ,switch完全无能为力 - 判断多个变量组合:
if (user.role === "admin" && user.status === "active") - 需要短路求值:
if (obj && obj.data && obj.data.items.length),switch无法链式判空 - 运行时计算值判断:比如
if (Math.random() > 0.5)或if (new Date().getHours()
if 嵌套太深怎么办?
不是“该不该用 switch 替代”,而是该重构逻辑——嵌套本身是代码异味,和语句类型无关。
立即学习“Java免费学习笔记(深入)”;
- 提前返回:把否定条件提前
return或throw,减少缩进层级 - 拆成小函数:每个
if块只做一件事,抽成有语义的函数,比如isValidEmail()、isRateLimited() - 查表驱动:如果最终是根据某个 key 映射到行为,可用对象或
Map替代长串if/else if,例如:const handlers = { save: handleSave, delete: handleDelete }; - 避免用
switch硬套多条件来“假装扁平化”,比如switch (a + '|' + b)—— 类型不安全、可读性差、调试困难
性能差异真的重要吗?
绝大多数业务场景下,if 和 switch 的执行速度差异可以忽略。真正影响性能的是:分支数量级、是否在热路径(如动画帧、大量循环)、以及是否触发隐式类型转换。
- V8 对
switch在 case 数 ≥ 7 且值密集时会生成跳转表(jump table),比线性if/else if快;但少于这个数,两者编译后几乎一样 - 更值得警惕的是
if (x == "5")这类宽松比较——每次都会触发类型转换,比switch (x)+case "5":慢且危险 - 如果分支逻辑本身很重(比如含 API 调用、DOM 操作),花时间优化
ifvsswitch不如先看能不能缓存、节流或延迟执行
真正容易被忽略的,是把 switch 当万能条件工具,或者把 if 嵌套当成理所当然——问题不在语法,而在没想清楚数据流向和边界条件。











