六维教程

JavaScript switch 语句

上一篇的 if 系列语句可以处理任意复杂的条件。不过有一种场景用 switch 更合适,就是根据单个值的不同取值做分支处理,比如星期几、月份、状态码。这篇就讲 switch 语句。

上一篇的 if 语句适合判断一个值”在哪个范围”,switch 则适合判断一个值”具体等于哪一个”,每个取值对应一段处理逻辑。

switch 基本语法

switch 括号里放一个值,从上到下依次跟每个 case 后的值比较,匹配上就执行该 case 里的语句,遇到 break 跳出整个 switch。

switch (表达式) {
  case1:
    // 匹配 值1 时执行
    break;
  case2:
    // 匹配 值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。
上一篇
JavaScript 条件判断 if 语句
下一篇
JavaScript while 与 do-while 循环