JavaScript switch 语句
上一篇的 if 系列语句可以处理任意复杂的条件。不过有一种场景用 switch 更合适,就是根据单个值的不同取值做分支处理,比如星期几、月份、状态码。这篇就讲 switch 语句。
上一篇的 if 语句适合判断一个值”在哪个范围”,switch 则适合判断一个值”具体等于哪一个”,每个取值对应一段处理逻辑。
switch 基本语法
switch 括号里放一个值,从上到下依次跟每个 case 后的值比较,匹配上就执行该 case 里的语句,遇到 break 跳出整个 switch。
switch (表达式) {
case 值1:
// 匹配 值1 时执行
break;
case 值2:
// 匹配 值2 时执行
break;
default:
// 都不匹配时执行
}
来看一个完整例子,根据星期数字输出中文星期名。
const day = 3;
let name = '';
switch (day) {
case 1:
name = '星期一';
break;
case 2:
name = '星期二';
break;
case 3:
name = '星期三';
break;
case 4:
name = '星期四';
break;
case 5:
name = '星期五';
break;
case 6:
name = '星期六';
break;
case 7:
name = '星期日';
break;
default:
name = '无效的星期';
}
console.log(name); // 输出 星期三
day 是 3,匹配到 case 3,执行后遇到 break 跳出,不会继续往后走。
break 不能漏
break 是跳出 switch 的关键。如果漏掉 break,执行完当前 case 后会直接穿透,继续执行后面所有 case 的语句,直到遇到 break 或整个 switch 结束。这个现象叫穿透。
const num = 1;
switch (num) {
case 1:
console.log('一');
case 2:
console.log('二');
case 3:
console.log('三');
}
猜猜会输出什么。没有 break,匹配 case 1 后一路往下,输出
一
二
三
大多数时候穿透不是想要的,所以每个 case 结尾都要记得写 break。不过穿透也可以利用,比如让多个值共享同一段代码。
const month = 2;
let days = 30;
switch (month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
days = 31;
break;
case 2:
days = 28;
break;
default:
days = 30;
}
console.log(days); // 输出 28
这种写法故意不写 break 让多个 case 合并,代码比写一串 if 判断更清爽。
default 分支
default 是可选的,放在最后,所有 case 都不匹配时执行它。上面星期例子里的 default 就是兜底,防止传入 0 或 8 这样的非法值。写 switch 时建议养成带 default 的习惯,万一遇到意外取值也有处理。
switch 和 if else 怎么选
选哪个看条件的形式。如果只是判断单个值等于哪个固定取值,用 switch 结构更清晰,case 排列整齐一眼能看完。如果条件涉及范围、大小比较或者多个条件的组合,if else 更合适,因为 switch 的 case 只能写固定值。
// 范围判断适合 if
const score = 85;
let level = '';
if (score >= 90) {
level = '优秀';
} else if (score >= 80) {
level = '良好';
}
// 固定取值适合 switch
const status = 404;
let message = '';
switch (status) {
case 200:
message = '成功';
break;
case 404:
message = '页面不存在';
break;
case 500:
message = '服务器出错';
break;
}
记住这个原则。固定取值用 switch,范围比较用 if else。两种写法都能实现同样的逻辑,选更清晰的那个就行。
小结
- switch 根据表达式的值从上到下匹配 case,匹配上执行后靠 break 跳出。
- 漏写 break 会产生穿透,继续执行后面的 case,多数时候是 bug,也可以故意利用穿透合并多个 case。
- default 是可选的兜底分支,所有 case 都不匹配时执行。
- 单个值有多个固定取值时 switch 更清晰,涉及范围、比较、复杂条件时用 if else。