if适用于布尔逻辑、范围条件或真值判断,switch仅适合等值匹配多个固定值;用错场景会导致可读性差、漏break或隐式转换错误。

if 适合判断布尔逻辑或范围条件,switch 更适合等值匹配多个固定值——用错场景会导致代码难读、漏掉 break 或类型隐式转换出错。
什么时候该用 if 而不是 switch
当条件涉及比较运算符(>、、!==)、逻辑组合(&&、||),或者需要判断变量是否为真值/假值时,if 是唯一合理选择。
常见错误是硬套 switch 做范围判断,比如:
switch (score) {
case score >= 90: // ❌ 语法错误:case 后必须是常量表达式
grade = 'A';
break;
}
- 判断用户权限等级:
if (role === 'admin' || role === 'moderator') - 检查输入有效性:
if (input == null || input.trim() === '') - 处理浮点数范围:
if (0.1
为什么 switch 的 case 必须用严格相等(===)比较
switch 内部使用的是抽象相等(==)算法,会触发类型转换。这意味着 switch('1') 会匹配 case 1:,因为 '1' == 1 为真。
立即学习“Java免费学习笔记(深入)”;
这种隐式转换极易引发 bug,尤其在处理 API 返回的字符串 ID 或表单输入时。
-
后端返回
{"id": "123"},你用switch (data.id)匹配case 123:→ 不会进分支 - 想匹配字符串又写了
case 123:→ 实际走的是'123' == 123→false - 正确做法是统一类型:
switch (String(id))或确保所有case都是字符串
switch 忘记 break 会怎样
没有 break 会导致“穿透”(fall-through):从匹配的 case 开始,一路执行到下一个 break 或 switch 结束。
这不总是错误——有时故意利用穿透做多条件共用逻辑,但绝大多数情况下是疏忽。
- 写成
case 'a': console.log('A'); case 'b': console.log('B');→ 输入'a'会同时打印 A 和 B - ESLint 规则
no-fallthrough默认警告无break的非空case - 若真要穿透,加注释说明:
// falls through
性能和可维护性的真实差异
现代 JS 引擎对两者优化都很成熟,单纯看执行速度没实质差别。真正影响体验的是可读性和后续修改成本。
switch 在分支超过 4–5 个且全是等值判断时,比一长串 else if 更易扫读;但一旦混入条件判断或需要提前 return,立刻变味。
- 适合
switch:status字段映射文案('pending'、'success'、'failed') - 适合
if:if (user.age - 复杂逻辑别硬塞进
switch,宁可拆成函数 +if
最常被忽略的一点:switch 没有“短路”机制,所有 case 表达式在进入前就已求值完毕;而 if (a() && b()) 中,b() 可能根本不会执行。











