减少if-else多重嵌套小技巧
在日常的代码编写中,相信大家或多或少都接触过拥有庞大if else的项目代码吧,多重嵌套的if else在维护的时候真的很让人恼火,一个bug排查下来,感觉身体被掏空。接下来将介绍几种在某些特定场景下代替if else的思路,并增加我们代码的可读性。
一、短路运算
Javascript的逻辑或 || 的短路运算有时候可以用来代替一些比较简单的if else,若左边能转成true,则返回左边式子的值,反之返回右边式子的值。
下面用一个简单的案例来表述:
let c if(a){ c = a }else{ c = b }
上面代码的书写简直就是强迫症患者的噩梦,明明就是一个很简单的判断却需要写好几行代码才能实现。这个时候就可以用短路运算去简化这一段代码了。
let c = a || b
二、三元运算符
三元运算符相信大家都很熟悉,很多时候简单的一些判断我们都可以使用三元运算符去代替if else,这里只推荐一层三元运算符,因为多层嵌套的三元运算符也不具备良好的可读性。
例子:条件为true时返回1,反之返回0。
const fn = nBoolean => { if(nBoolean){ return 1 }else{ return 0 } } // 使用三元运算符 const fn = nBoolean => { return nBoolean ? 1 : 0 }
三元运算符使用的地方也比较多,比如:条件赋值、递归...
// num值在nBoolean为true时为10,否则为5 let num = nBoolean ? 10 : 5 // 求0-n之间的整数的和 let sum = 0 const add = n => { sum += n return n >= 2 ? add(n - 1) : sum } let num = add(10) // 55
三、switch case
上述的两种方式:短路运算符和三元运算符虽然很好用,代码也很简洁,不过都只能用于简单的判断,遇到多重条件判断就不能使用了。
对于switch case,虽然它的可读性确实比if else更高,但是我想大家应该都觉得它写起来比较麻烦吧。
例:有A、B、C、D四种类型,在A、B的时候输出1,C输出2、D输出3,默认输出0。
let type = 'A' // if else if if(type === 'A' || type === 'B'){ console.log(1) }else if(type === 'C'){ console.log(2) }else if(type === 'D'){ console.log(3) }else{ console.log(0) } // switch case switch(type){ case 'A': case 'B': console.log(1) break case 'C': console.log(2) break case 'D': console.log(3) break default: console.log(0) }
四、对象配置/策略模式
对象配置看起来跟策略模式差不多,都是根据不同的参数使用不同的数据/算法/函数。策略模式就是将一系列算法封装起来,并使它们相互之间可以替换。被封装起来的算法具有独立性,外部不可改变其特性。
接下来我们用对象配置的方法实现一下上述的例子:
let type = 'A' let tactics = { 'A':1, 'B':1, 'C':2, 'D':3, default:0 } console.log(tactics[type]) // 1 let strategies = new Map[ ['A',1], ['B',1], ['C',2], ['D',3], ['default',0] ] const calculate = (type = default) => { return strategies.get(type) } console.log(calculate('A')) // 1
本文主要是想传递一种思想,我们有很多的方法去优化我们的代码,提高我们代码的可读性,对if else并没有歧视的意思,只是我们的代码中不仅仅只有if else。