switch语句 #

一、switch语句概述 #

switch语句是一种多分支选择结构,根据表达式的值执行匹配的case分支。相比多重if-else if,switch语句更加清晰易读。

二、基本语法 #

2.1 语法结构 #

typescript
switch (expression) {
  case value1:
    // 语句
    break;
  case value2:
    // 语句
    break;
  default:
    // 默认语句
}

2.2 基本示例 #

typescript
const day = 3;

switch (day) {
  case 1:
    console.log("星期一");
    break;
  case 2:
    console.log("星期二");
    break;
  case 3:
    console.log("星期三");
    break;
  case 4:
    console.log("星期四");
    break;
  case 5:
    console.log("星期五");
    break;
  case 6:
    console.log("星期六");
    break;
  case 7:
    console.log("星期日");
    break;
  default:
    console.log("无效的日期");
}

三、case穿透 #

3.1 穿透现象 #

如果没有break语句,会继续执行下一个case:

typescript
const grade = "B";

switch (grade) {
  case "A":
    console.log("优秀");
    // 没有break,会继续执行
  case "B":
    console.log("良好");
    // 没有break,会继续执行
  case "C":
    console.log("及格");
    break;
  default:
    console.log("不及格");
}
// 输出:良好 及格

3.2 利用穿透 #

多个case执行相同代码:

typescript
const month = 2;

switch (month) {
  case 1:
  case 3:
  case 5:
  case 7:
  case 8:
  case 10:
  case 12:
    console.log("31天");
    break;
  case 4:
  case 6:
  case 9:
  case 11:
    console.log("30天");
    break;
  case 2:
    console.log("28或29天");
    break;
  default:
    console.log("无效月份");
}

3.3 季节判断 #

typescript
const month = 7;

switch (month) {
  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;
  case 12:
  case 1:
  case 2:
    console.log("冬季");
    break;
  default:
    console.log("无效月份");
}

四、default分支 #

4.1 默认分支 #

当没有匹配的case时执行default:

typescript
const color = "purple";

switch (color) {
  case "red":
    console.log("红色");
    break;
  case "green":
    console.log("绿色");
    break;
  case "blue":
    console.log("蓝色");
    break;
  default:
    console.log("其他颜色");
}

4.2 default位置 #

default可以放在任意位置,但通常放在最后:

typescript
const value = 0;

switch (value) {
  default:
    console.log("默认值");
    break;
  case 1:
    console.log("一");
    break;
  case 2:
    console.log("二");
    break;
}

五、switch表达式 #

5.1 返回值 #

switch可以作为表达式使用:

typescript
const day = 3;
const dayName = (() => {
  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 "无效";
  }
})();

console.log(dayName); // 星期三

5.2 函数返回 #

typescript
function getDayName(day: number): string {
  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 "无效";
  }
}

六、类型匹配 #

6.1 字符串匹配 #

typescript
const status = "success";

switch (status) {
  case "success":
    console.log("操作成功");
    break;
  case "error":
    console.log("操作失败");
    break;
  case "pending":
    console.log("处理中");
    break;
  default:
    console.log("未知状态");
}

6.2 数字匹配 #

typescript
const statusCode = 404;

switch (statusCode) {
  case 200:
    console.log("OK");
    break;
  case 201:
    console.log("Created");
    break;
  case 400:
    console.log("Bad Request");
    break;
  case 404:
    console.log("Not Found");
    break;
  case 500:
    console.log("Internal Server Error");
    break;
  default:
    console.log("Unknown Status");
}

6.3 枚举匹配 #

typescript
enum Direction {
  Up = "UP",
  Down = "DOWN",
  Left = "LEFT",
  Right = "RIGHT"
}

function move(direction: Direction): void {
  switch (direction) {
    case Direction.Up:
      console.log("向上移动");
      break;
    case Direction.Down:
      console.log("向下移动");
      break;
    case Direction.Left:
      console.log("向左移动");
      break;
    case Direction.Right:
      console.log("向右移动");
      break;
  }
}

move(Direction.Up);

七、高级用法 #

7.1 范围判断 #

typescript
const score = 85;

switch (true) {
  case score >= 90:
    console.log("优秀");
    break;
  case score >= 80:
    console.log("良好");
    break;
  case score >= 60:
    console.log("及格");
    break;
  default:
    console.log("不及格");
}

7.2 类型判断 #

typescript
function process(value: unknown): void {
  switch (typeof value) {
    case "string":
      console.log(`字符串: ${value}`);
      break;
    case "number":
      console.log(`数字: ${value}`);
      break;
    case "boolean":
      console.log(`布尔值: ${value}`);
      break;
    case "object":
      if (value === null) {
        console.log("null");
      } else if (Array.isArray(value)) {
        console.log("数组");
      } else {
        console.log("对象");
      }
      break;
    case "undefined":
      console.log("undefined");
      break;
    default:
      console.log("未知类型");
  }
}

7.3 解构匹配 #

typescript
interface Point {
  x: number;
  y: number;
}

function describePoint(point: Point): string {
  const { x, y } = point;
  
  switch (true) {
    case x === 0 && y === 0:
      return "原点";
    case x === 0:
      return "Y轴上";
    case y === 0:
      return "X轴上";
    case x > 0 && y > 0:
      return "第一象限";
    case x < 0 && y > 0:
      return "第二象限";
    case x < 0 && y < 0:
      return "第三象限";
    case x > 0 && y < 0:
      return "第四象限";
    default:
      return "未知位置";
  }
}

八、switch vs if-else #

8.1 使用switch的场景 #

typescript
// 多个离散值判断
function getColor(color: string): string {
  switch (color) {
    case "red": return "#ff0000";
    case "green": return "#00ff00";
    case "blue": return "#0000ff";
    default: return "#000000";
  }
}

8.2 使用if-else的场景 #

typescript
// 范围判断、复杂条件
function getGrade(score: number): string {
  if (score >= 90) return "A";
  if (score >= 80) return "B";
  if (score >= 70) return "C";
  if (score >= 60) return "D";
  return "F";
}

// 多条件组合
function canAccess(user: { role: string; active: boolean }): boolean {
  if (user.role === "admin" && user.active) {
    return true;
  }
  if (user.role === "editor" && user.active) {
    return true;
  }
  return false;
}

九、实际应用 #

9.1 HTTP请求处理 #

typescript
async function handleRequest(request: Request): Promise<Response> {
  const url = new URL(request.url);
  
  switch (url.pathname) {
    case "/":
      return new Response("Home Page");
    case "/api/users":
      return handleUsers(request);
    case "/api/posts":
      return handlePosts(request);
    case "/api/comments":
      return handleComments(request);
    default:
      return new Response("Not Found", { status: 404 });
  }
}

9.2 状态机 #

typescript
type State = "idle" | "loading" | "success" | "error";
type Action = "start" | "success" | "fail" | "reset";

function transition(state: State, action: Action): State {
  switch (state) {
    case "idle":
      switch (action) {
        case "start": return "loading";
        default: return state;
      }
    case "loading":
      switch (action) {
        case "success": return "success";
        case "fail": return "error";
        default: return state;
      }
    case "success":
    case "error":
      switch (action) {
        case "reset": return "idle";
        default: return state;
      }
  }
}

9.3 命令解析 #

typescript
interface Command {
  type: string;
  payload?: unknown;
}

function executeCommand(command: Command): void {
  switch (command.type) {
    case "CREATE":
      handleCreate(command.payload);
      break;
    case "UPDATE":
      handleUpdate(command.payload);
      break;
    case "DELETE":
      handleDelete(command.payload);
      break;
    case "READ":
      handleRead(command.payload);
      break;
    default:
      console.log(`未知命令: ${command.type}`);
  }
}

十、最佳实践 #

10.1 总是使用break #

typescript
// 不推荐:忘记break
switch (value) {
  case 1:
    console.log("一");
    // 忘记break
  case 2:
    console.log("二");
    break;
}

// 推荐:每个case都有break
switch (value) {
  case 1:
    console.log("一");
    break;
  case 2:
    console.log("二");
    break;
}

10.2 使用return替代break #

typescript
function getDayName(day: number): string {
  switch (day) {
    case 1: return "星期一";
    case 2: return "星期二";
    case 3: return "星期三";
    default: return "无效";
  }
}

10.3 注释穿透 #

typescript
switch (month) {
  case 1:
  case 3:
  case 5:
    // 31天的月份
    console.log("31天");
    break;
}

十一、总结 #

本章学习了:

  • switch语句的基本语法
  • case穿透现象和利用
  • default分支的使用
  • switch作为表达式
  • 类型和枚举匹配
  • 高级用法(范围判断、类型判断)
  • switch vs if-else的选择
  • 实际应用场景

下一章,我们将学习循环语句。

最后更新:2026-03-28