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 '不及格';
}
| 特性 | switch | if-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 穿透有时可利用,但需添加注释说明意图
📝 发现内容有误?点击此处直接编辑