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