当程序要把同一个值与多个固定选项比较时,switch 通常比很长的 if-else if 链更清楚。JavaScript 会先计算 switch 括号中的选择值,再跳到匹配的 case。
基本结构
每个 case 后写一个常量和冒号。匹配后执行该分支中的语句;break 结束整个 switch;default 处理没有任何 case 匹配的情况。
let day = 4;
switch (day) {
case 1:
console.log("Monday");
break;
case 2:
console.log("Tuesday");
break;
case 3:
console.log("Wednesday");
break;
case 4:
console.log("Thursday");
break;
case 5:
console.log("Friday");
break;
case 6:
case 7:
console.log("Weekend");
break;
default:
console.log("Invalid day");
}这个例子完整覆盖星期一到星期日。case 6 和 case 7 连续排列并共享同一个代码体,这是有意使用贯穿来合并相同结果。
break 与贯穿
如果一个 case 执行完却没有 break,控制流会继续进入后面的 case,这叫 fall-through。除非多个选项确实需要共享逻辑,否则应在每个独立分支末尾写 break。
每个 case 后面都是一个表达式。JavaScript 使用严格相等(===)把它与选择值比较,因此数字 1 和字符串 "1" 不会匹配。字符串和数字都常用作选择值。
执行顺序
- 计算 switch 的选择值。
- 寻找值相等的 case;找不到则进入 default。
- 从匹配位置开始执行语句。
- 遇到 break 或 switch 末尾时退出。
互动实验
switch 单步调试器
访问权限免费
选择会员等级,然后点击高亮代码行或“运行当前行”。每次只执行一条语句,变量和控制台会同步变化。
创建 tier,值为 2。
知识测验
题目
如果 case 执行后没有 break,通常会发生什么?
动手练习
制作会员折扣结算器
读取会员等级和订单原价,用 switch 设置折扣率,再计算顾客的实际应付金额。
- 读取整数会员等级 tier 和订单原价 amount。
- 普通会员 0 级不打折,1、2、3 级会员分别享受 5%、10%、15% 折扣。
- 用 switch 给 discount 赋值;无效等级需要输出提示并结束程序。
- 根据 amount * (1 - discount) 计算应付金额,并保留两位小数输出。