代码中嵌套的if/else结构每每致使代码不美观,也不易于理解。面向过程的开发中代码有大量的IF ELSE,在java中能够用一些设计模式替换掉这些逻辑,那么在js中是否也有相似的方法用来尽量减小代码中的if/else嵌套呢?前端
有人认为:if else多就多呗,只要可读性强,维护起来方便。jQuery.fn.init里就是一堆if else判断,难道要质疑jQuery做者的水平了?
并非说if else多就很差,关键是看用的地方,jQuery.fn.init里除了if else判断简洁点,难道要改为switch?就算用工厂模式,还不是得作大量的if判断。java
代码整洁强迫症患者必需要来个抛砖引玉:程序员
if(a为真){ a=a }else{ a=b }
可写成:a = a || bajax
if(a==b){ a=c }else{ a=d }
可写成:a = (a==b) ? c : dexpress
后台接口一般会返回这种数据:
fruit: 0 // 0=苹果,1=梨子,2=桔子,3=柠檬,4=芒果...
这时写if...else是最痛苦的。从冲哥那偷来个方法:后端
var _f = ['苹果','梨子','桔子','柠檬','芒果']; shuiguo = _f[fruit];
人们考虑的东西到时候,都会把最可能发生的状况先作好准备。优化if逻辑的时候也能够这样想:把最可能出现的条件放在前面,把最不可能出现的条件放在后面,这样程序执行时总会按照带啊名的前后顺序逐一检测全部的条件,知道发现匹配的条件才会中止继续检测。设计模式
if
的优化目标:最小化找到分支以前所判断条件体的数量。if优化的方法:将最多见的条件放在首位。服务器
if (i < 5) { // 执行一些代码 } else if (i > 5 && i < 10) { // 执行一些代码 } else { // 执行一些代码 }
例如上面这个例子,只有在i
值常常出现小于5的时候是最优化的。若是i值常常大于或者等于10的话,那么在进入正确的分支以前,就必须两次运算条件体,致使表达式的平均运算时间增长。if
中的条件体应该老是按照从最大几率到最小几率排列,以保证理论速度最快。函数
若是在函数中,可使用 if + return
,先判断错误条件,而后立马结束函数,防止进入 else
分支。性能
举个简单的例子,后端返回数据,前端根据状态进行不一样操做
$.ajax().done(function (res) { if (res.state === 'SUCCESS') { //TODO } else if (res.state === 'FAIL') { //TODO } else { //TODO } });
这里用if else不挺好的么,有啥问题么?不过我我的倾向于switch。
解决方法:
switch和if else在性能上是没有什么区别的,主要仍是根据需求进行分析和选择。
若是条件较小的话选用if else比较合适。
相反,条件数量较大的话,就建议选用switch。
通常来讲,if else适用于两个离散的值或者不一样的值域。若是判断多个离散值,使用switch更加合适。
在大多数的状况下switch比if else运行的更加快。
在大多数状况下,switch的性能不会比if else低。switch的确在实质上跟if else if 彻底同样的效果,不过在不少状况下,使用switch要比if else方便很多
好比经典的值等分支,匹配一些状态常量的时候,比if else结构方便许多,不用反复写xx == yy
$.ajax().done(function (res) { switch (res.state) { case 'SUCCESS': //TODO break; case 'FAIL': //TODO break; default : //TODO } });
注意:千万不要忘记在每个case语句后面放一个break语句。也能够放一个return或者throw。case语句匹配expression是用===而不是==。
if (key == "Apple") { val = "Jobs"; } else if (key == "microsoft"){ val = "Gates"; } else if (key == "Google"){ val = "Larry"; }
这个也能够用 switch case
解决,不过推荐的方法是 hash 表:
var ceos = {"Apple":"Jobs", "microsoft":"Gates", "Google":"Larry"}; val = ceos[key];
1.若是是狗,则汪汪 2.若是是猫,则喵喵 3.若是是羊,则咩咩 4.若是是鸭,则嘎嘎
能够重构一下,改为 OO。
*定义类: 动物(或者接口) *定义方法:叫 *定义子类:狗、猫、羊、鸭 *重写方法 ---- 叫
也就是说将同的判断按照功能,写成函数,这样也便于阅读
好比我有一个方法根据类型获取名称,用if else会这样
function getName(type) { if (type === 'monkey') { return 'monkey name'; } else if (type === 'cat') { return 'cat name'; } else { return 'dog name'; } }
若是写成函数,改为下面的会更好
function getName(type) { var data = { monkey: 'monkey name', cat: 'cat name', dog: 'dog name' } return data[type] ? data[type] : data['dog']; }
硬要把设计模式添加到JS里不是不能够,可是要看状况。生搬硬套过来的东西然并卵啊。
写代码记住三个字便可,短简易。代码短,读起来简单,维护容易,若是在性能和代码长度上二选一,我确定选代码短,性能不行,加台服务器就是了。而冗长的代码并非加个程序员就能搞定的。
保持着这个心态写代码,写出的东西离设计模式也不会差太多了。
多说一句:存在必有其价值,不能说if else多了就很差,凡事无绝对,适合A的未必就适合B,每一个东西都有其实现的场景。同理改写设计模式未必就是最棒的,听起来高大上点而已。