我们经常需要根据不同的条件执行不同的逻辑,传统上,if-else
和 switch
语句是处理这类场景的常用方式。然而,随着现代 JavaScript 的发展,出现了更优雅、更简洁的替代方案:对象映射(Object Literal)和 Map 数据结构。
传统 switch 语句的问题
首先,让我们看看传统 switch
语句的典型用法:
这种写法存在几个问题:
- 冗长且重复 - 每个
case
都需要写 case
关键字和 return
或 break
语句 - 容易出错 - 忘记
break
语句会导致意外的 fall-through 行为 - 难以维护 - 添加或修改分支时,需要在大块代码中仔细添加
- 可读性较差 - 尤其当每个 case 分支包含较多逻辑时
使用对象映射(Object Literal)替代 switch
对象映射是替代简单 switch
语句的最直接方式:
处理复杂逻辑
如果每个分支包含更复杂的逻辑,可以将函数作为对象的值:
使用 Map 数据结构
ES6 引入的 Map
数据结构提供了比对象字面量更强大的功能,特别适合以下场景:
- 键不限于字符串,可以是任何类型(包括对象、函数等)
用法示例
函数映射和链式操作
Map 非常适合实现命令模式或策略模式:
classCalculator {
constructor() {
this.operations = newMap([
['+', (a, b) => a + b],
['-', (a, b) => a - b],
['*', (a, b) => a * b],
['/', (a, b) => a / b],
['%', (a, b) => a % b],
['', (a, b) => a b]
]);
}
calculate(a, operator, b) {
const operation = this.operations.get(operator);
if (!operation) {
throw new Error(`Unsupported operator: ${operator}`);
}
return operation(a, b);
}
// 扩展计算器功能
addOperation(operator, fn) {
this.operations.set(operator, fn);
return this; // 支持链式调用
}
}
const calc = new Calculator()
.addOperation('log', (a, b) =>Math.log(a) / Math.log(b));
console.log(calc.calculate(10, '+', 5)); // 15
console.log(calc.calculate(10, 'log', 10)); // 1
现代 JavaScript 为我们提供了多种工具来改进代码质量,拥抱对象映射和 Map,可以让我们编写出更优雅、更易维护的代码。
阅读原文:原文链接
该文章在 2025/5/6 12:16:02 编辑过