这里说的是不应该使用 if-else 的地方尽量不去写 if,而不是去掉所有的 if-else
不必要的 else 块
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| function func(arg) { if (arg) { } else { } }
function func(arg) { if (arg) { } }
|
价值分配
有些时候不需要生命个变量,然后再赋值返回
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| function func(arg) { let gender; if (arg === 0) { gender = "woman"; } else if (arg === 1) { gender = "man"; } else { gender = "unknown"; } }
function func(arg) { if (arg === 0) return "woman"; if (arg === 1) return "man"; throw new Error("非法参数"); }
|
简单值多个条件,转成对象形式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| function func(arg) { if (arg === "xxx") { } else if (arg === "yyy") { } else { throw new Error("非法参数"); } }
function func(arg) { const actions = { xxx: () => { }, yyy: () => { }, }; if (actions["xxx"]) { actions["xxx"](); } else { throw new Error("非法参数"); } }
|
复杂条件,改用策略模式
1 2 3 4 5 6 7 8 9
| function func(arg1, arg2, arg3) { if ((arg1 === "xxx" && arg2 === "yyy") || arg3 === "zzz") { } else if (arg1 === "xxx" || (arg2 === "yyy" && arg3 === "zzz")) { } else { throw new Error("非法参数"); } }
|
如果是这种复杂的条件,对象的形式就实现不了了,这没有办法了吗?
其实有个设计模式叫策略模式,先上个策略模式的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| function exeStrategyActions(actions) { actions.some(([flag, action]) => { if (flag) { action(); } return flag; }); }
type StrategyAction = [boolean, () => void]; function exeStrategyActions(actions: StrategyAction[]) { actions.some((item) => { const [flag, action] = item; if (flag) { action(); } return flag; }); }
|
用法也很简单,比如上面的 if 示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| function func(arg1, arg2, arg3) { exeStrategyActions([ [ (arg1 === "xxx" && arg2 === "yyy") || arg3 === "zzz", () => { }, ], [ arg1 === "xxx" || (arg2 === "yyy" && arg3 === "zzz"), () => { }, ], [ true, () => { throw new Error("非法参数"); }, ], ]); }
|
exeStrategyActions 函数会一个一个寻找条件是 true 的值,直到找到 true,然后执行传进去的回调函数,