电脑知识铺
第二套高阶模板 · 更大气的阅读体验

代码条件判断写法:别再只会if-else了

发布时间:2025-12-10 14:38:53 阅读:168 次

代码的时候,条件判断几乎无处不在。比如你在做内网穿透工具的状态监控,需要根据当前连接状态显示不同提示——连上了就绿灯,断了就红灯报警。这时候最直接的想法就是用 if-else。

基础写法:if-else 没问题,但容易臃肿

比如判断内网服务的几种状态:

if (status === 'connected') {
  showGreenLight();
} else if (status === 'disconnected') {
  showRedLight();
} else if (status === 'connecting') {
  showYellowLight();
} else {
  showGrayLight();
}

看起来清楚,可一旦状态变多,比如加上超时、认证失败、配置错误等十几种情况,这个 if 堆起来就又长又难改。

用对象映射替代冗长判断

可以把状态和对应操作做成一个映射表:

const statusActions = {
  connected: () => showGreenLight(),
  disconnected: () => showRedLight(),
  connecting: () => showYellowLight(),
  timeout: () => showRedLightWithTip('连接超时'),
  authFailed: () => showRedLightWithTip('认证失败'),
  default: () => showGrayLight()
};

// 使用
const action = statusActions[status] || statusActions.default;
action();

这样新增状态只需要往对象里加一行,不用动逻辑。维护起来轻松不少。

三元运算符适合简单分支

有时候只是返回值不同,比如根据是否在线决定显示文字:

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

比写 if 更简洁。但如果嵌套三层以上,读起来就费劲了,尽量避免嵌套三元。

逻辑运算符也能做判断

在某些场景下,可以用 && 和 || 来简化代码。比如只有连接成功才触发回调:

isConnected && triggerSuccessCallback();

或者提供默认值:

const port = config.port || 8080;

这种写法短小精悍,但别滥用,尤其别让别人看不懂你的意图。

switch 并非完全过时

当分支较多且逻辑复杂时,switch 依然有用武之地。比如处理不同的协议类型转发规则:

switch (protocol) {
  case 'http':
    forwardHttp(target);
    break;
  case 'https':
    forwardHttps(target);
    break;
  case 'tcp':
    forwardTcp(target);
    break;
  default:
    throw new Error('不支持的协议');
}

比起一串 if-else,结构更清晰,也方便加 case 注释。

提前 return 减少嵌套

很多人写条件喜欢层层嵌套:

if (user) {
  if (user.hasPermission) {
    if (user.isActive) {
      doSomething();
    }
  }
}

其实可以反过来,先排除不符合的情况:

if (!user) return;
if (!user.hasPermission) return;
if (!user.isActive) return;

doSomething();

扁平化结构更容易阅读,也减少大括号的视觉负担。

实际项目中的组合拳

真实开发中,往往几种方式混着来。比如你写一个内网穿透客户端的状态处理器,可能先用对象映射处理大部分状态,特殊逻辑再单独拎出来判断:

// 大部分状态走映射
if (statusActions[status]) {
  statusActions[status]();
  return;
}

// 特殊处理:重试超过三次弹警告
if (status === 'disconnected' && retryCount > 3) {
  showAlert('已重试多次,请检查网络');
}

showRedLight();

灵活搭配才是关键,没有哪一种写法能通吃所有场景。