> 技术文档 > JavaScript switch 语句

JavaScript switch 语句


关键要点

  • JavaScript 的 switch 语句用于根据条件选择执行不同的代码块。
  • 它通过比较表达式的值与 case 值来决定执行哪部分代码。
  • 需要注意 break 语句以避免代码贯穿,以及 default 用于无匹配时的处理。

什么是 switch 语句?

switch 语句是 JavaScript 中的一种条件语句,类似于 if...else,但更适合处理多个离散值的情况。它通过评估一个表达式,并将其值与多个 case 子句进行比较,来决定执行哪部分代码。

基本语法与使用

语法如下:

switch (表达式) { case1: // 执行的代码 break; case2: // 执行的代码 break; default: // 无匹配时的默认代码}
  • 表达式:需要评估的值,例如变量或函数调用。
  • case:与表达式值进行比较的可能值,如果匹配则执行该 case 后的代码。
  • break:结束 switch 块的执行,防止代码贯穿到下一个 case
  • default:如果没有 case 匹配,则执行此部分代码。

示例与注意事项

以下是一个示例,判断星期几并输出中文星期名:

let day = new Date().getDay();switch (day) { case 0: day = \"星期天\"; break; case 1: day = \"星期一\"; break; case 6: day = \"星期六\"; break; default: day = \"工作日\";}console.log(day);

注意:

  • switch 使用严格相等(===)比较,类型和值必须匹配。
  • 如果省略 break,代码会继续执行下一个 case,称为“贯穿”,需谨慎使用。
  • default 可以放在任意位置,但如果不是最后一个 case,需使用 break

详细说明

以下是关于 JavaScript switch 语句的全面分析,包含技术细节和使用场景,适合深入了解。

语法与工作原理

switch 语句的语法为:

switch (expression) { case caseExpression1: statements case caseExpression2: statements // ... case caseExpressionN: statements default: statements}
  • expression 是需要评估的表达式,其值会与每个 casecaseExpression 进行严格比较(===)。
  • 如果找到匹配的 case,从该 case 开始执行代码,直到遇到 breakswitch 结束。
  • 如果没有匹配,且存在 default,则执行 default 下的代码。
关键特性
  1. 严格比较switch 使用 === 进行比较,确保类型和值都匹配。例如,字符串 “0” 与数字 0 不匹配。

  2. 贯穿行为:如果某个 case 没有 break,执行会继续到下一个 case,直到遇到 breakswitch 结束。这种行为称为“贯穿”,适合多个 case 共享代码。例如:

    let fruit = \"banana\";switch (fruit) { case \"apple\": case \"banana\": console.log(\"水果价格为 5 元/斤\"); break; default: console.log(\"未知水果\");}

    这里,“apple” 和 “banana” 共享相同的代码块。

  3. break 的作用break 语句用于终止 switch 块的执行,节省时间并防止不必要的代码执行。最后一个 casedefault 可以省略 break,因为块已自然结束。

  4. default 的位置default 可以在 switch 块的任意位置,但如果不是最后一个 case,需使用 break 以避免意外执行。例如:

    switch (day) { default: console.log(\"工作日\"); break; case 0: console.log(\"星期天\"); break;}
词法作用域与变量声明

casedefault 不创建新的作用域,因此在 case 块中使用 letconst 时需注意。例如:

switch (action) { case \"sayHello\": let message = \"你好\"; // 错误:Uncaught SyntaxError: Identifier \'message\' has already been declared console.log(message); break;}

解决方法是将代码包裹在块中:

switch (action) { case \"sayHello\": { const message = \"你好\"; console.log(message); break; }}
使用场景与与 if...else 的对比
  • switch 适合处理多个离散值的情况,例如根据状态码或枚举值执行不同逻辑。

  • if...else 相比,switch 语法更简洁,易于阅读,尤其当条件是精确值时。例如:

    // 使用 if...elseif (day === 0) { console.log(\"星期天\");} else if (day === 1) { console.log(\"星期一\");} // ...// 使用 switchswitch (day) { case 0: console.log(\"星期天\"); break; case 1: console.log(\"星期一\"); break; // ...}

    经验法则是:当条件是精确值时,优先使用 switch;当条件涉及范围或复杂逻辑时,使用 if...else

示例分析

以下是几个实际示例,展示 switch 的使用:

  1. 判断星期几

    switch (new Date().getDay()) { case 6: text = \"今天是周六\"; break; case 0: text = \"今天是周日\"; break; default: text = \"期待周末~\";}console.log(text);
  2. 严格比较问题

    let x = \"0\";switch (x) { case 0: console.log(\"数字 0\"); // 不执行,因为 \"0\" (字符串) 与 0 (数字) 不匹配 break; default: console.log(\"默认值\");}
  3. 贯穿示例

    let score = 85;switch (true) { case score >= 90: grade = \"A\"; break; case score >= 80: grade = \"B\"; // score = 85 时执行这里 break; default: grade = \"C\";}console.log(grade); // 输出 \"B\"
技术细节与规范
  • switch 语句自 2015 年 7 月起在所有主流浏览器中可用。
  • 规范参考:ECMAScript® 2026 Language Specification # sec-switch-statement。
常见问题与最佳实践
  • 忘记 break:会导致意外的代码贯穿,需仔细检查每个 case 是否有 break
  • 类型不匹配:由于严格比较,需确保表达式和 case 值类型一致。
  • 性能考虑switch 通常比多层 if...else 更快,尤其当 case 数量较多时。
总结

JavaScript 的 switch 语句是一种强大的条件控制工具,适合处理多个离散值的场景。通过合理使用 breakdefault,可以确保代码逻辑清晰且高效。注意严格比较和贯穿行为,以避免潜在错误。

表格:switch 语句与 if...else 对比
特性 switch 语句 if...else 语句 适用场景 多个离散值,精确匹配 范围比较、复杂逻辑 语法简洁性 高,结构清晰 低,嵌套可能复杂 性能 通常更快,尤其 case 较多时 较慢,逐个条件判断 严格比较 是(===) 否(可使用 == 或其他比较)

关键引文

  • MDN Web Docs switch 语句解释
  • W3School JavaScript Switch 语句详解