前言
- 在项目当中,都会遇到需要做大量分支判断的情况,最常用到的就是用 if/else;但是用起来并不是很美观;所以当遇到大量分支判断嵌套在一起时,就会显得很难阅读。就要对应地做出一些优化。
简单逻辑判断
提前 return
1 2 3 4 5 6 7 8 9 10 11 12
| let a = 1; if (a) { a = 2; } else { return; }
if (!a) { return; } a = 2;
|
||
1 2 3 4 5 6 7 8 9
| let a = 1; if (a) { a = 1; } else { a = 2; }
a = a || 0;
|
三元表达式
1 2 3 4 5 6 7 8 9 10 11 12 13
| let a = 1, b = 2, c = 3, d = 4;
if (a === b) { a = d; } else { a = c; }
a = a === b ? d : c;
|
按位异或运算符^
1 2 3 4 5 6 7 8 9
| let a =1,b=2,c=1, if(a === c){ c = b }else if(b === c){ c = a }
a = a^b^c
|
复杂逻辑判断
if 逻辑优化
人们考虑的东西到时候,都会把最可能发生的情况先做好准备。优化 if 逻辑的时候也可以这样想:把最可能出现的条件放在前面,把最不可能出现的条件放在后面,这样程序执行时总会按照写的逻辑的先后顺序逐一检测所有的条件,知道发现匹配的条件才会停止继续检测。
- if 的优化目标:最小化找到分支之前所判断条件体的数量。
- if 优化的方法:将最常见的条件放在首位。
1 2 3 4 5 6 7 8
| var a = 1; if(a < 10){ ... }else if(a > 10 && a < 100){ ... }else{ ... }
|
switch/case
switch 在性能上和 if/else 区别不是很大,在大量分支判断时会比 if/else 看上去整洁。
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 27 28
| function formatData(time, format) { var t = new Date(time); var tf = function (i) { return (i < 10 ? "0" : "") + i; }; return format.replace(/yyyy|MM|dd|HH|mm|ss/g, function (a) { switch (a) { case "yyyy": return tf(t.getFullYear()); break; case "MM": return tf(t.getMonth() + 1); break; case "mm": return tf(t.getMinutes()); break; case "dd": return tf(t.getDate()); break; case "HH": return tf(t.getHours()); break; case "ss": return tf(t.getSeconds()); break; } }); }
|
利用 Object 重构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| let a = 0; if (type === "type_1") { a = 10; } else if (type === "type_2") { a = 20; } else if (type === "type_3") { a = 30; }
const obj = { type_1: 10, type_2: 20, type_3: 30, };
console.log(obj[type]);
|
利用 Map
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 27 28 29 30 31 32 33 34 35 36 37 38
| let a = 0; if (type === "type_1") { function type1() { a = 10; } } else if (type === "type_2") { function type2() { a = 20; } } else if (type === "type_3") { function type3() { a = 30; } }
const action = new Map([ [ "type_1", () => { a = 10; }, ], [ "type_2", () => { a = 20; }, ], [ "type_3", () => { a = 30; }, ], ]);
let data = action.get(type); console.log(data());
|
相关文章:JavaScript 复杂判断(if else / switch)的更优雅写法 优化冗余