5 个可以替代 if-else 的代码优化技巧


if-else 是我们最熟悉、最常用的逻辑控制语句,它简单、直接,是逻辑的基石之一。

但随着业务逻辑变得越来越复杂,很容易写出冗长、嵌套的 if-else 结构,导致代码的可读性差和维护困难。

但 JavaScript 是一门灵活的语言,分享 5 个可以有效替代 if-else 的实用技巧。

技巧一:使用三元运算符

这是最简单直接的替代方案,适用于只有两个分支的简单 if-else 结构,尤其是在进行变量赋值时。

** 优化前: **

let statusText;  
if (isOnline) {  
  statusText = '在线';  
} else {  
  statusText = '离线';  
}  

** 优化后: **

const statusText = isOnline ? '在线' : '离线';  

** 优点 ** :代码极其简洁,可读性强,将一个简单的逻辑判断和赋值操作浓缩到一行。

技巧二:使用 Map 或对象字面量进行映射

if-else 的分支增多,且每个分支都对应一个固定的返回值时,使用 Map 或对象来进行查找(lookup)是绝佳的选择。

** 优化前: **

function getStatusMessage(status) {  
  if (status === 'success') {  
    return '操作成功';  
  } else if (status === 'error') {  
    return '发生错误';  
  } else if (status === 'pending') {  
    return '处理中...';  
  } else {  
    return '未知状态';  
  }  
}  

** 优化后: **

** 优点 ** :

  • ** 可读性高 ** :逻辑关系一目了然,就像查字典一样
  • ** 易于扩展 ** :新增一个状态时,只需在 statusMessages 对象中增加一个键值对即可

技巧三:使用策略模式(函数映射)

如果你的不同条件分支执行的是不同的 ** 操作(函数) ** ,而不是返回静态值,那么可以映射到函数上,这就是一种轻量级的策略模式。

** 优化前: **

function handleApiResponse(response) {  
  if (response.code === 200) {  
    handleSuccess(response.data);  
  } else if (response.code === 401) {  
    redirectToLogin();  
  } else if (response.code === 404) {  
    showNotFoundPage();  
  } else {  
    showGenericError();  
  }  
}  

** 优化后: **

** 优点 ** :将“条件判断”和“具体执行”解耦。每个操作都是一个独立的函数,职责清晰,代码结构更加模块化和可测试。

技巧四:善用短路运算符 ( && , || , ?? )

在很多情况下,我们只是想在满足某个条件时执行一个操作,或者在某个值为 null / undefined
时提供一个默认值。这时,短路运算符是你的好朋友。

1. 使用 && 替代简单的 if

** 优化前: **

if (isDebugMode) {  
  console.log('这是一条调试信息');  
}  

** 优化后: **

isDebugMode && console.log('这是一条调试信息');  

** 原理 ** : && 运算符只有在左侧表达式为真(truthy)时,才会执行并返回右侧的表达式。

2. 使用 || ?? 提供默认值

** 场景 ** :获取一个可能不存在的用户名,如果不存在,则显示“游客”。

** 优化前: **

let displayName;  
if (user.name) {  
  displayName = user.name;  
} else {  
  displayName = '游客';  
}  

** 优化后: **

** 注意 || ?? 的区别 ** :

  • || 会将所有“假值”( false , 0 , '' , null , undefined , NaN ) 都替换为默认值
  • ?? 只会将 null undefined 替换为默认值。如果你希望保留 0 或空字符串 '' 这样的有效值, ?? 是更安全的选择

技巧五:使用规则数组

当条件判断变得更加复杂,不再是简单的键值匹配(例如,包含范围判断 > < )时,我们可以将一系列规则抽象成一个数组。

** 场景 ** :根据订单金额,计算不同的折扣率。

** 优化前: **

function getDiscount(orderAmount) {  
  if (orderAmount >= 500) {  
    return 0.2; // 20% 折扣  
  } else if (orderAmount >= 200) {  
    return 0.1; // 10% 折扣  
  } else if (orderAmount >= 100) {  
    return 0.05; // 5% 折扣  
  } else {  
    return 0;  
  }  
}  

** 优化后: **

const discountRules = [  
  { condition: amount => amount >= 500, discount: 0.2 },  
  { condition: amount => amount >= 200, discount: 0.1 },  
  { condition: amount => amount >= 100, discount: 0.05 },  
];  
  
function getDiscount(orderAmount) {  
  // 查找第一个满足条件的规则  
  const rule = discountRules.find(r => r.condition(orderAmount));  
  return rule ? rule.discount : 0;  
}  

** 优点 ** :

  • ** 声明式 ** :代码从“如何做”变成了“是什么”。定义一系列规则,然后让程序自己去匹配
  • ** 极易扩展 ** :新增一个折扣档位,只需在 discountRules 数组的 ** 最前面 ** 加一个对象即可

if-else 本身没有错,它是编程的必要组成部分。但当它演变成具有复杂逻辑的代码时,就需要对其进行优化了。