ZetCode

JavaScript switch/case 语句

最后修改于 2025 年 4 月 16 日

在本文中,我们将展示如何使用 switchcase 关键字在 JavaScript 中创建条件语句。

switch/case 语句

switch 语句评估一个表达式,并根据匹配的 case 执行代码。 当针对多个可能性测试单个值时,它提供了对冗长的 if-else 链的替代方案。

每个 case 代表 switch 表达式的一个可能匹配项。当找到匹配项时,相应的代码块将执行,直到遇到 break 语句。

当未找到匹配项时,default case 将执行。 虽然是可选的,但包含一个 default case 来处理意外值是一个好习惯。

基本 switch 语句

以下示例演示了 switch 语句的基本结构。

main.js
let day = 3;
let dayName;

switch (day) {
    case 1:
        dayName = 'Monday';
        break;
    case 2:
        dayName = 'Tuesday';
        break;
    case 3:
        dayName = 'Wednesday';
        break;
    case 4:
        dayName = 'Thursday';
        break;
    case 5:
        dayName = 'Friday';
        break;
    default:
        dayName = 'Weekend';
}

console.log(dayName);

此代码将数字日转换为其对应的名称。switch 评估 day 变量并执行匹配的 case。 如果没有 break 语句,则执行将“落入”到后续的 case 中。

$ node main.js
Wednesday

Fall-through 行为

JavaScript switch 语句默认表现出 fall-through 行为。

main.js
let grade = 'B';
let message;

switch (grade) {
    case 'A':
    case 'B':
    case 'C':
        message = 'Passing grade';
        break;
    case 'D':
        message = 'Barely passing';
        break;
    case 'F':
        message = 'Failing grade';
        break;
    default:
        message = 'Unknown grade';
}

console.log(message);

在这里,多个 case 共享相同的代码块。 A、B 和 C 等级都产生相同的消息。这演示了故意的 fall-through,它对于将相关的 case 分组在一起很有用。

$ node main.js
Passing grade

严格比较

switch 语句在匹配 case 时使用严格比较 (===)。

main.js
let value = '5';

switch (value) {
    case 5:
        console.log('Number 5');
        break;
    case '5':
        console.log('String "5"');
        break;
    default:
        console.log('Unknown value');
}

此示例显示,字符串 '5' 与数字 5 不匹配,因为严格的类型比较。switch 语句在评估 case 时区分不同的数据类型。

$ node main.js
String "5"

在 case 中使用表达式

case 标签可以包含评估为常量值的表达式。

main.js
let score = 85;
let grade;

switch (true) {
    case score >= 90:
        grade = 'A';
        break;
    case score >= 80:
        grade = 'B';
        break;
    case score >= 70:
        grade = 'C';
        break;
    case score >= 60:
        grade = 'D';
        break;
    default:
        grade = 'F';
}

console.log(grade);

该技术通过切换到 true 来在 case 中使用布尔表达式。 评估每个 case,直到找到匹配条件。 对于范围检查,它提供了对复杂 if-else 链的干净替代方案。

$ node main.js
B

具有多个条件的 Switch

switch 语句可以在单个 case 中处理多个条件。

main.js
let fruit = 'apple';
let color;

switch (fruit) {
    case 'apple':
    case 'strawberry':
        color = 'red';
        break;
    case 'banana':
    case 'lemon':
        color = 'yellow';
        break;
    case 'orange':
        color = 'orange';
        break;
    default:
        color = 'unknown';
}

console.log(color);

此示例按颜色对水果进行分组。 多个水果可以共享相同的颜色分配。 switch 语句提供了一种干净的方式来处理这些分组条件,而无需重复代码。

$ node main.js
red

Switch vs if-else

与等效的 if-else 链相比,switch 语句通常提供更清晰的代码。

main.js
let browser = 'Firefox';

switch (browser) {
    case 'Chrome':
    case 'Firefox':
    case 'Safari':
        console.log('Supported browser');
        break;
    case 'IE':
        console.log('Deprecated browser');
        break;
    default:
        console.log('Unknown browser');
}

当检查多个完全匹配项时,switch 版本比一系列 if-else 语句更具可读性。 它以结构化的格式清楚地显示了所有可能的 case 及其相应的操作。

$ node main.js
Supported browser

实用示例:命令处理器

这是一个使用 switch 处理不同命令的实用示例。

main.js
function processCommand(cmd) {
    switch (cmd.toLowerCase()) {
        case 'start':
            console.log('Starting system...');
            break;
        case 'stop':
            console.log('Stopping system...');
            break;
        case 'restart':
            console.log('Restarting system...');
            break;
        case 'status':
            console.log('System status: OK');
            break;
        default:
            console.log(`Unknown command: ${cmd}`);
    }
}

processCommand('START');
processCommand('status');
processCommand('backup');

此命令处理器演示了 switch 如何处理不同的输入命令。 toLowerCase() 确保不区分大小写的匹配。 default case 优雅地处理无效命令。

$ node main.js
Starting system...
System status: OK
Unknown command: backup

来源

switch - 语言参考

在本文中,我们已经演示了如何使用 switch 和 case 关键字在 JavaScript 中创建条件语句。

作者

我叫 Jan Bodnar,是一位充满激情的程序员,拥有丰富的编程经验。 我从 2007 年开始撰写编程文章。迄今为止,我撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

查看 所有 JavaScript 教程。