为了根据不同的条件执行不同的逻辑,传统的做法是使用 switch 语句或者多个 if-else
分支,但这些方法往往会让代码变得冗长且难以维护。
传统 switch 语句的痛点
让我们先看一个典型的 switch 语句示例:
function getStatusMessage(status) {
switch (status) {
case 'loading':
return '正在加载...';
case 'success':
return '操作成功!';
case 'error':
return '操作失败,请重试';
case 'timeout':
return '请求超时';
default:
return '未知状态';
}
}
这种写法存在几个问题:
- ** 代码冗长 ** :每个 case 都需要写
break语句 - ** 易出错 ** :忘记写
break会导致贯穿执行 - ** 可读性差 ** :大量的样板代码影响核心逻辑的阅读
- ** 难以扩展 ** :添加新条件需要修改函数内部
对象映射:更简洁的替代方案
基础用法
使用对象映射,上面的代码可以简化为:

优势显而易见:
- 代码量减少了 60%
- 逻辑更清晰,一目了然
- 不会出现忘记
break的问题
函数映射:处理复杂逻辑
当需要执行复杂逻辑时,可以将值设为函数:

Map 对象:更强大的键值映射
对于需要非字符串键的场景,可以使用 Map 对象:

高级应用场景
多条件映射

性能对比
让我们来看看性能差异:
// 测试数据
const testCases = Array.from({ length: 10000 }, () =>
['loading', 'success', 'error', 'timeout'][Math.floor(Math.random() * 4)]
);
// Switch 版本
function switchVersion(status) {
switch (status) {
case 'loading': return '正在加载...';
case 'success': return '操作成功!';
case 'error': return '操作失败,请重试';
case 'timeout': return '请求超时';
default: return '未知状态';
}
}
// 对象映射版本
const objectMapping = {
loading: '正在加载...',
success: '操作成功!',
error: '操作失败,请重试',
timeout: '请求超时'
};
function objectVersion(status) {
return objectMapping[status] || '未知状态';
}
// 性能测试
console.time('Switch版本');
testCases.forEach(switchVersion);
console.timeEnd('Switch版本');
console.time('对象映射版本');
testCases.forEach(objectVersion);
console.timeEnd('对象映射版本');
通常情况下,对象映射的性能会略优于 switch 语句,特别是在分支较多的情况下。
当然,这并不意味着要完全抛弃 switch
语句。在选择使用哪种方案时,应该根据具体的业务场景和需求来决定。对于简单的映射关系,对象映射是更好的选择;对于复杂的条件判断和控制流,switch
语句可能更加合适。