⚡ 编程实验室🏗️ HTML🎨 CSS⚡ JavaScript🐍 Python🗄️ SQL☕ Java⚛️ React💚 Vue🟢 Node.js⚙️ C语言🐘 PHP🐹 Go🔷 TypeScript🐬 MySQL🔧 C++🎯 C#🦀 Rust🅱️ Bootstrap💡 jQuery🎸 Django🍃 MongoDB👗 Sass🎪 Kotlin📊 R语言📋 XML📊 Excel🐘 PostgreSQL🐳 Docker🅰️ Angular🎮 游戏🏠 网站首页

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 全面对比

比较维度switchif...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;
}
  1. 星期转换器:写一个函数 weekDay(n),参数是数字 0-6,0 代表星期日,用 switch 返回对应的中文星期名称。处理无效输入时返回友好提示。
  2. 四则运算计算器:用 prompt 接收两个数字和一个运算符(+、-、*、/),用 switch 根据运算符执行相应计算。特别注意除法时分母不能为零的处理,以及 default 处理无效运算符。
  3. 成绩等级判断:输入分数(0-100),使用 switch(true) 技巧判断成绩等级(A: 90+,B: 80-89,C: 70-79,D: 60-69,F: 60以下),输出对应的等级和评语。
  4. 季节判断(穿透练习):输入月份(1-12),利用 switch 的穿透特性输出对应的季节(春:3-5,夏:6-8,秋:9-11,冬:12,1,2),每个季节只写一行 console.log,不重复代码。
  5. 简易菜单系统:用 switch 实现一个简易 ATM 菜单:选项 1-查询余额,2-取款,3-存款,4-修改密码,5-退出。每个选项输出对应的提示信息,用 default 处理无效输入,并在输入5时输出"感谢使用,再见!"。
Ctrl+Enter
🚀 升级VIP
解锁全部课程+AI助手

🏆 学习排行

加载中...

📊 统计

📖 231 篇
0 完成
🔥 0