JavaScript switch:case 分支与 default 兜底
JavaScript switch 语句会先计算一次表达式,然后使用严格相等(===)把执行流路由到匹配的 case 标签。当每个分支都在用同一个变量匹配离散值时,它比 if...else 链更清晰,例如命令分发、状态映射或固定选项处理。switch 把这种按值分流集中在一个代码块里,并通过 break 明确控制是否继续向后贯穿执行。
JavaScript Switch 按值分流示例
输出:
输出将显示在这里...
输出:
正在保存文件
这个示例如何工作
switch (command)会先计算command一次,然后按源码顺序把结果和每个 JavaScriptcase标签比较。"保存"这个case匹配成功,执行流跳到该分支并运行console.log("正在保存文件")。break会直接退出整个switch代码块。没有它时,执行会继续贯穿到下一个case的代码体,即使下一个标签不匹配。default是兜底分支:当没有任何case标签匹配时执行。若default在最后一个位置,后面不需要再写break。
在 case "保存": 这种 JavaScript case statement 里,标签是“要匹配的值”,不是单独的布尔条件。
JavaScript Switch Case 的常见错误
忘记写 break: 缺少它会导致执行贯穿到后续每个 case 代码体。只有在你明确要把多个标签归并到同一处理逻辑时才应省略 break。
const command = "保存";
switch (command) {
// 错误:当 command 是 "保存" 时会打印两条消息
case "保存":
console.log("正在保存");
case "关闭":
console.log("正在关闭");
}
在 case 标签里混用类型: switch 使用 ===,所以 "2" 永远不会匹配 2。进入 switch 前先把表达式转换成一致类型。
在多个 case 里重复声明 let/const: 所有 case 共享同一个 switch 块级作用域。两个分支都声明 let result 会抛出 SyntaxError,应给每个 case 包一层 { } 以创建独立词法作用域。
Switch 与 if…else 对比
适合用 switch 的场景 | 适合用 if...else 的场景 |
|---|---|
| 把一个表达式和多个固定值比较 | 条件涉及区间、不等式或不同变量 |
需要通过贯穿把多个 case 复用同一处理逻辑 | 每个分支都有独立的复合逻辑 |
当值到动作的映射很大时,用对象查表有时比这两种写法都更清晰。记得处理缺失键,避免把 undefined 当函数调用。
更多示例
把多个 case 标签归并到同一处理逻辑:
const day = "周六";
switch (day) {
case "周六":
case "周日":
console.log("周末");
break;
default:
console.log("工作日");
}
在标签之间不写 break,可以把列出的所有值路由到同一个代码块。共享处理逻辑应保持简短,并用 break、return 或 throw 结束,避免误执行后续分支。
如果每个标签需要不同处理,避免使用贯穿,让每个 case 都有独立代码体和退出点。
FAQ
JavaScript switch 用的是 == 还是 ===?
switch 使用严格相等(===)比较。它不会做类型转换,所以 0 不匹配 "0",null 也不匹配 undefined。确保表达式和值标签的类型一致。
在 switch case 里省略 break 会发生什么?
执行会贯穿到下一个 case 的代码体,不管下一个标签是否匹配。这个过程会一直持续到遇到 break、return 或到达 switch 末尾。刻意贯穿通常用于让多个 case 共用同一处理逻辑。
default 可以写在其他 cases 前面吗?
可以。default 在 switch 块里的位置不受限制。它仍然只会在没有任何 case 匹配时运行,然后从该位置继续向后执行,因此除非它本身就在最后一个分支,否则需要在 default 后写 break。