优化复杂业务状态判断的核心是显式化、可配置、易维护“状态→行为”映射。优先用对象字面量做查找表;动态/复杂键用Map或WeakMap;逻辑复杂时采用策略模式;多条件判断用卫语句提前退出。

复杂业务状态判断容易堆砌大量 if/else 或 switch,导致代码膨胀、分支难扩展、新增状态要动主逻辑。优化核心是把“状态 → 行为”的映射关系显式化、可配置、易维护。
用对象映射替代硬编码分支
当状态值固定且行为是简单函数调用或返回值时,优先用对象字面量做查找表:
- 把每个状态码作为 key,对应处理函数或结果作为 value
- 访问时直接 map[status],不存在则 fallback 到默认项
- 避免重复写 case 或 else if,新增状态只需加一行配置
例如订单状态跳转:
const routeMap = {'pending': () => '/order/pending',
'paid': () => '/order/confirm',
'shipped': () => '/order/delivery',
'cancelled': () => '/order/cancel',
default: () => '/order/unknown'
};
const to = (routeMap[status] || routeMap.default)();
用 Map 或 WeakMap 处理动态或复杂键
对象只支持字符串/符号作 key;若状态是对象、数组或需精确引用比较,改用 Map:
立即学习“Java免费学习笔记(深入)”;
- 允许任意类型作键,比如 statusObj、new Set([1,2])、甚至 DOM 元素
- 适合多维组合状态,如 Map([[{type:'vip',level:3}, handlerA]])
- WeakMap 可用于私有状态绑定,避免内存泄漏
策略模式封装可复用的判断逻辑
当不同状态下的处理逻辑差异大、涉及异步、副作用或需上下文参数时,把每个分支抽成独立策略类或函数:
- 定义统一接口,如 execute(context)
- 策略实例按需创建或缓存,支持依赖注入和单元测试
- 主流程只负责路由:根据状态选策略,再调 execute
例如审批流中,不同角色触发不同校验规则,策略名可由后端配置下发,前端动态加载。
提前退出 + 卫语句减少嵌套深度
不是所有场景都适合查表——尤其当判断本身含多个条件(如 status === 'active' && user.role === 'admin' && date > deadline)时:
- 用卫语句(guard clause)提前过滤无效路径:if (!status) return;
- 把否定条件放在前面,快速失败,避免深层缩进
- 组合条件可拆成变量提升可读性:const isUrgent = status === 'urgent' && priority > 5;
这样既保持逻辑清晰,又避免陷入“箭头反模式”。


















