写代码的时候,条件判断几乎无处不在。比如你在做内网穿透工具的状态监控,需要根据当前连接状态显示不同提示——连上了就绿灯,断了就红灯报警。这时候最直接的想法就是用 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();
灵活搭配才是关键,没有哪一种写法能通吃所有场景。