全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-16 6 分钟 ✍️ juanwangdev

JavaScript switch 语句

switch 语句根据表达式的值匹配 case 标签执行对应代码块,适用于多分支离散值判断。

基本语法

JavaScript
switch (表达式) {
    case 值1:
        // 表达式 === 值1 时执行
        break;
    case 值2:
        // 表达式 === 值2 时执行
        break;
    default:
        // 以上都不匹配时执行
        break;
}

代码示例

JavaScript
// 基本用法
let day = 3;
switch (day) {
    case 1:
        console.log('星期一');
        break;
    case 2:
        console.log('星期二');
        break;
    case 3:
        console.log('星期三');
        break;
    default:
        console.log('其他');
}
// 输出:星期三

// 多个 case 共享代码
let 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;
}

匹配规则

JavaScript
// 严格相等匹配(===)
let value = '1';
switch (value) {
    case 1:
        console.log('数字1');  // 不匹配,类型不同
        break;
    case '1':
        console.log('字符串1');  // 匹配
        break;
}

// 表达式作为 case 值
let x = 2;
switch (true) {
    case x < 0:
        console.log('负数');
        break;
    case x === 0:
        console.log('零');
        break;
    case x > 0:
        console.log('正数');  // 匹配
        break;
}

break 和 default

JavaScript
// 没有 break 会继续执行(case 穿透)
let num = 1;
switch (num) {
    case 1:
        console.log('一');
        // 没有 break,继续执行下一个 case
    case 2:
        console.log('二');  // 也会输出
        break;
    case 3:
        console.log('三');
        break;
}
// 输出:一 二

// default 位置不强制放最后
let grade = 'B';
switch (grade) {
    default:
        console.log('未知等级');
        break;
    case 'A':
        console.log('优秀');
        break;
    case 'B':
        console.log('良好');  // 匹配
        break;
}

// default 可选
let fruit = 'apple';
switch (fruit) {
    case 'banana':
        console.log('香蕉');
        break;
    // 没有 default,无匹配时不执行任何代码
}

实际应用

JavaScript
// 处理 HTTP 状态码
function getStatusMessage(code) {
    switch (code) {
        case 200:
            return '成功';
        case 201:
            return '已创建';
        case 400:
            return '请求错误';
        case 401:
            return '未授权';
        case 404:
            return '未找到';
        case 500:
            return '服务器错误';
        default:
            return '未知状态';
    }
}

// 根据类型处理
function process(action) {
    switch (action.type) {
        case 'ADD':
            return addItem(action.payload);
        case 'UPDATE':
            return updateItem(action.payload);
        case 'DELETE':
            return deleteItem(action.id);
        default:
            throw new Error('未知操作');
    }
}

// 键盘事件处理
document.addEventListener('keydown', (e) => {
    switch (e.key) {
        case 'Enter':
            submit();
            break;
        case 'Escape':
            cancel();
            break;
        case 'ArrowUp':
            moveUp();
            break;
        case 'ArrowDown':
            moveDown();
            break;
    }
});

switch vs if-else

JavaScript
// switch 更适合:离散值判断
switch (status) {
    case 'pending': return '待处理';
    case 'processing': return '处理中';
    case 'completed': return '已完成';
    case 'failed': return '失败';
}

// if-else 更适合:范围判断、复杂条件
if (score >= 90) {
    return '优秀';
} else if (score >= 80) {
    return '良好';
} else if (score >= 60) {
    return '及格';
} else {
    return '不及格';
}
特性switchif-else
匹配方式严格相等 ===任意条件表达式
适用场景离散值判断范围判断、复杂条件
可读性多分支时更清晰条件少时更简洁

注意事项

  • 每个 case 后必须有 break,否则会发生穿透
  • default 放置位置灵活,建议放在最后
  • 比较使用严格相等 ===,注意类型匹配
  • case 穿透有时可利用实现多个 case 共享代码
JavaScript
// 利用穿透特性
let permission = 'editor';
switch (permission) {
    case 'admin':
        console.log('完全访问权限');
        // 故意穿透
    case 'editor':
        console.log('编辑权限');
        // 故意穿透
    case 'viewer':
        console.log('查看权限');
        break;
}
// 输出:编辑权限 查看权限

要点总结

  • switch 基于表达式值进行严格相等匹配
  • 每个 case 后使用 break 防止穿透
  • 多个 case 可共享同一代码块
  • default 处理无匹配情况
  • 适合离散值判断,if-else 更适合范围判断
  • case 穿透有时可利用,但需添加注释说明意图

📝 发现内容有误?点击此处直接编辑

← 上一篇 JavaScript for 循环
下一篇 → JavaScript while 循环
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库