JS Switch 语句
学习 switch/case/default 多分支判断 · 难度:入门 · +10XP
JavaScript Switch 语句详解
当需要根据一个变量的值执行不同代码块时,if...else if...else 可以完成任务,但当分支较多时代码会变得冗长且难以维护。此时 switch 语句是更清晰的选择。它将一个表达式与多个 case 值进行严格相等比较(===),匹配成功后执行对应代码块。
基本语法结构
switch 语句首先计算一次表达式的值,然后将该值与每个 case 标签的值从上到下依次进行严格相等比较。一旦找到匹配的 case,就执行该 case 下的所有代码,直到遇到 break 关键字或整个 switch 语句结束为止。
// 基本语法
switch (表达式) {
case 值1:
// 匹配值1时执行的代码
break; // 跳出 switch,防止穿透
case 值2:
// 匹配值2时执行的代码
break;
case 值3:
// 匹配值3时执行的代码
break;
default:
// 以上所有 case 都不匹配时执行
}
星期计算器示例
这是 switch 最经典的应用场景——将有限的枚举值映射到对应的输出。下面的代码根据数字返回中文星期名称,注意每个 case 后面都使用了 return 或 break 来阻止穿透。
function getWeekdayName(day) {
switch (day) {
case 1: return '星期一';
case 2: return '星期二';
case 3: return '星期三';
case 4: return '星期四';
case 5: return '星期五';
case 6: return '星期六';
case 7: return '星期日';
default: return '请输入 1-7 之间的数字';
}
}
console.log(getWeekdayName(3)); // 星期三
console.log(getWeekdayName(8)); // 请输入 1-7 之间的数字
break 的重要性 —— 穿透现象(Fall-Through)
如果没有 break,代码会不受控制地继续执行下一个 case 的代码块,无论该 case 的值是否匹配。这种现象称为"穿透"。初学者常因忘记写 break 而产生意外结果,但有时我们也可以刻意利用穿透来简化代码——让多个 case 共享同一段执行逻辑。
// 危险的穿透(忘写 break 导致意外输出)
let grade = 'B';
switch (grade) {
case 'A':
console.log('优秀');
// 这里忘了写 break!
case 'B':
console.log('良好');
// 又忘了!
case 'C':
console.log('及格');
default:
console.log('需要努力');
}
// 输出四行:良好、及格、需要努力 —— 全都执行了!
// 合理利用穿透(多个 case 共享结果)
let month = 3;
switch (month) {
case 12: case 1: case 2:
console.log('冬季');
break;
case 3: case 4: case 5:
console.log('春季');
break;
case 6: case 7: case 8:
console.log('夏季');
break;
case 9: case 10: case 11:
console.log('秋季');
break;
default:
console.log('无效月份');
}
// 输出: 春季 —— 3、4、5 三个 case 共用一个代码块
switch(true) 技巧 —— 处理范围判断
switch 通常用于精确值匹配,但有一个巧妙的方法可以处理范围判断:将表达式设为 true,然后在每个 case 中写条件表达式。这样 switch 会把 true 与每个 case 表达式的结果做严格相等比较。
// switch(true) 模式 —— 替代冗长的 if...else if
let score = 85;
switch (true) {
case score >= 90:
console.log('等级:优秀');
break;
case score >= 80:
console.log('等级:良好');
break;
case score >= 70:
console.log('等级:中等');
break;
case score >= 60:
console.log('等级:及格');
break;
default:
console.log('等级:不及格');
}
// 输出: 等级:良好
switch vs if...else 全面对比
| 比较维度 | switch | if...else if |
|---|---|---|
| 可读性(多分支) | 结构清晰,一目了然 | 分支多时缩进深、冗长 |
| 比较方式 | 严格相等(===) | 可自定义任意布尔表达式 |
| 范围判断 | 不便,需枚举每个值(或用 switch(true) 技巧) | 自然,直接写 >、< 等 |
| 条件复杂度 | 仅等值比较 | 支持任意逻辑组合 |
| 性能(多分支) | JS引擎可优化为跳转表 | 逐个条件顺序求值 |
| 最佳场景 | 固定值的枚举选择(菜单、状态机) | 复杂条件、范围判断 |
default 子句的位置
default 是可选的,通常放在所有 case 之后。但 JavaScript 语法允许 default 出现在任意位置。如果 default 不在末尾,仍然需要加 break,否则会发生穿透。
// default 不在末尾时需小心
let color = 'purple';
switch (color) {
default:
console.log('未知颜色');
break; // 必须写 break,否则穿透到 case 'red'
case 'red':
console.log('红色');
break;
case 'blue':
console.log('蓝色');
break;
}
- 星期转换器:写一个函数 weekDay(n),参数是数字 0-6,0 代表星期日,用 switch 返回对应的中文星期名称。处理无效输入时返回友好提示。
- 四则运算计算器:用 prompt 接收两个数字和一个运算符(+、-、*、/),用 switch 根据运算符执行相应计算。特别注意除法时分母不能为零的处理,以及 default 处理无效运算符。
- 成绩等级判断:输入分数(0-100),使用 switch(true) 技巧判断成绩等级(A: 90+,B: 80-89,C: 70-79,D: 60-69,F: 60以下),输出对应的等级和评语。
- 季节判断(穿透练习):输入月份(1-12),利用 switch 的穿透特性输出对应的季节(春:3-5,夏:6-8,秋:9-11,冬:12,1,2),每个季节只写一行 console.log,不重复代码。
- 简易菜单系统:用 switch 实现一个简易 ATM 菜单:选项 1-查询余额,2-取款,3-存款,4-修改密码,5-退出。每个选项输出对应的提示信息,用 default 处理无效输入,并在输入5时输出"感谢使用,再见!"。