javaScript switch语句替代方案

在JavaScript中,switch语句常用于处理多分支条件,但其存在冗长、易出错、难维护等问题。以下是几种高效且优雅的替代方案,结合性能、可读性和扩展性进行设计

  • 原始switch语句
const action = 'action1';
switch (action) {
    case 'action1':
        console.log('Action 1');
        break;
    case 'action2':
        console.log('Action 2');
        break;
    case 'action3':
        console.log('Action 3');
        break;
    default:
        console.log('Unknown action');
}
  • 对象映射(Object Mapping)
    使用对象映射可以将每个条件与对应的处理逻辑关联起来,避免了大量的switch语句。

    const actions = {
        'action1': () => console.log('Action 1'),
        'action2': () => console.log('Action 2'),
        'action3': () => console.log('Action 3') 
    }
    const action = 'action1';
    actions[action]?.(); // 调用对应的处理逻辑
    
    const dayMap = {
     1: 'Monday',
     2: 'Tuesday',
     // ...其他值
     7: 'Sunday'
     };
     const getDayName = (day) => dayMap[day] || 'Invalid day';
    
  • Map 数据结构(ES6+)
    支持任意类型键(如对象、函数),提供更丰富的操作方法(如get、has)

    const actions = new Map([
        ['action1', () => console.log('Action 1')],
        ['action2', () => console.log('Action 2')],
        ['action3', () => console.log('Action 3')]
    ]);
    const action = 'action1';
    actions.get(action)?.(); // 调用对应的处理逻辑
    
  • 策略模式
    将每个分支逻辑封装为独立函数,通过统一接口调用,符合开放-封闭原则

const strategies = {
    'action1': () => console.log('Action 1'),
    'action2': () => console.log('Action 2'),  
}
const executeAction = (action) => {
    strategies[action]?.(); // 调用对应的处理逻辑 
}
executeAction('action1'); // 调用对应的处理逻辑

const operations = {
  add: (a, b) => a + b,
  subtract: (a, b) => a - b,
  // ...其他操作
};
const calculate = (action, a, b) => operations[action]?.(a, b) ?? 'Invalid action';
console.log(calculate('add', 10, 5)); 
  • 函数式编程
    使用高阶函数和函数组合,将条件逻辑和处理逻辑解耦
const actions = {
  'action1': () => console.log('Action 1'),
  'action2': () => console.log('Action 2'), 
}
const executeAction = (action) => actions[action]?.();
const executeIf = (condition, action) => condition ? executeAction(action) : null;
executeIf(true, 'action1'); // 调用对应的处理逻辑
  • 数组映射
    利用数组方法检查值是否存在,替代多case匹配。

onst validNames = ['afshin', 'saeed', 'larry'];
const greet = (name) => validNames.includes(name) ? 'Hey' : 'Unknown';
console.log(greet('saeed')); // "Hey"

你可能感兴趣的:(javascript,前端,开发语言)