我们日常使用到的逻辑判断语句有 if...else...switch...case...do...while...等。

在简单场景下,我们可能对这些语法的性能没有什么感觉,但当遇到复杂的业务场景时,如果处理不善,就会出现大量的逻辑嵌套,可读性差并且难以扩展。

千里之行始于足下,编写高可维护性和高质量的代码,我们就需要从细节处入手,我们今天主要讨论 JavaScript 中如何优化逻辑判断代码。

嵌套层级优化

function supply(fruit, quantity) {const redFruits = ['apple', 'strawberry', 'cherry', 'cranberries'];// 条件 1: 水果存在if (fruit) {// 条件 2: 属于红色水果if (redFruits.includes(fruit)) {console.log('红色水果');// 条件 3: 水果数量大于 10 个if (quantity > 10) {console.log('数量大于 10 个');}}} else {throw new Error('没有水果啦!');}
}

通过上面这个例子,我们可以看到:判断流程中规中矩,符合现实世界的映射。但是,因代码层层嵌套,导致阅读和维护都存在困难。

如果传入了 fruit 参数,则每次执行都至少需要经过两步 if 判断,在性能上也存在问题。

我们来对上面的代码进行一下优化处理:

function supply(fruit, quantity) {const redFruits = ['apple', 'strawberry', 'cherry', 'cranberries'];if (!fruit) throw new Error('没有水果啦');     // 条件 1: 当 fruit 无效时,提前处理错误if (!redFruits.includes(fruit)) return; // 条件 2: 当不是红色水果时,提前 returnconsole.log('红色水果');// 条件 3: 水果数量大于 10 个if (quantity > 10) {console.log('数量大于 10 个');}
}

这里主要对嵌套层级做了优化,提前终止掉了不符合的条件,将三层嵌套减少到了一层,简化了代码结果结构,增强了可阅读性。

多条件分支的优化

相信我们很多人对下面这种代码不陌生吧?(想想刚开始写代码那会啊)

function pick(color) {// 根据颜色选择水果if (color === 'red') {return ['apple', 'strawberry'];} else if (color === 'yellow') {return ['banana', 'pineapple'];} else if (color === 'purple') {return ['grape', 'plum'];} else {return [];}
}

我们需要知道一点原则:if else 更适合于条件区间判断,而 switch case 更适合于具体枚举值的分支判断。

我们使用 switch…case…进行一下改写:

function pick(color) {// 根据颜色选择水果switch (color) {case 'red':return ['apple', 'strawberry'];case 'yellow':return ['banana', 'pineapple'];case 'purple':return ['grape', 'plum'];default:return [];}
}

switch...case... 优化之后的代码看上去格式整齐,思路很清晰,但还是很冗长。继续优化:

  • 借助 Object 的 {key: value} 结构,我们可以在 Object 中枚举所有的情况,然后将 key 作为索引,直接通过 Object.key 或者 Object[key] 来获取内容:
const fruitColor = {red: ['apple', 'strawberry'],yellow: ['banana', 'pineapple'],purple: ['grape', 'plum'],
}
function pick(color) {return fruitColor[color] || [];
}
  • 使用 Map 数据结构,真正的(key, value) 键值对结构:
const fruitColor = new Map().set('red', ['apple', 'strawberry']).set('yellow', ['banana', 'pineapple']).set('purple', ['grape', 'plum']);function pick(color) {return fruitColor.get(color) || [];
}

优化之后,代码更简洁、更容易扩展。

为了更好的可读性,还可以通过更加语义化的方式定义对象,然后使用 Array.filter 达到同样的效果:

const fruits = [{name: 'apple', color: 'red'},{name: 'strawberry', color: 'red'},{name: 'banana', color: 'yellow'},{name: 'pineapple', color: 'yellow'},{name: 'grape', color: 'purple'},{name: 'plum', color: 'purple'}
];function pick(color) {return fruits.filter(f => f.color == color);
}

总结

上面使用的例子和手段都比较初级,但是其中的思想却值得我们细品,希望大家能够有所收获!

学习有趣的知识,结识有趣的朋友,塑造有趣的灵魂!

大家好!我是〖编程三昧〗的作者 隐逸王,我的公众号是『编程三昧』,欢迎关注,希望大家多多指教!

知识与技能并重,内力和外功兼修,理论和实践两手都要抓、两手都要硬!

前端 JavaScript 条件语句优化相关推荐

  1. 5个小技巧让你写出更好的 JavaScript 条件语句

    在使用 JavaScript 时,我们常常要写不少的条件语句.这里有五个小技巧,可以让你写出更干净.漂亮的条件语句. 1.使用 Array.includes 来处理多重条件 举个栗子 : // 条件语 ...

  2. 5个小技巧让你写出更好的JavaScript 条件语句

    在使用 JavaScript 时,我们常常要写不少的条件语句.这里有五个小技巧,可以让你写出更干净.漂亮的条件语句. 使用 Array.includes 来处理多重条件 举个栗子 : // 条件语句 ...

  3. JavaScript 条件语句和循环语句

    if条件语句 主要用于范围值的判断 语法: 1.条件成立时执行,条件不成立时什么也不做 if(条件) { 条件成立时要执行的代码 }; 2.条件成立时执行,执行if内的代码,条件不成立时,执行else ...

  4. mysql c where_mysql where条件语句优化笔记

    where优化主要适用于SELECT查询,当然DELETE和UPDATE语句中也会涉及,这个要大家在平常多积累. 删除不必要的括号: ((a AND b) AND c OR (((a AND b) A ...

  5. if test 多条件_五条写好JavaScript条件语句的建议(译)

    1. 多重准则时使用 Array.includes 看个栗子: function test(fruit) {if (fruit == 'apple' || fruit == 'strawberry') ...

  6. javascript条件语句if else用法

    语法 语法1: if (条件) {如果条件为 true 时执行的代码 } 语法2: if (条件) {条件为 true 时执行的代码块 } else { 条件为 false 时执行的代码块 }语法3: ...

  7. Javascript中的条件语句和循环语句

    Javascript条件语句有以下几种: 单项条件结构 (if条件语句) 双向条件结构 (if...else条件语句) 多项条件结构 (switch条件语句) If条件语句的语法如下: if (exp ...

  8. Web前端开发笔记——第四章 JavaScript程序设计 第四节 条件语句和循环语句

    目录 一.if条件语句 二.while循环语句 (一)while()语句 (二)do--while语句 三.for循环语句 四.switch语句 五.break语句和continue语句 一.if条件 ...

  9. 5个技巧让你更好的编写 JavaScript(ES6) 中条件语句

    使用 JavaScript 时,我们经常需要处理很多条件语句,这里分享5个小技巧,可以让你编写更好/更清晰的条件语句. 1.使用 Array.includes 来处理多个条件 我们来看看下面的例子: ...

最新文章

  1. RayTracking 光线跟踪算法
  2. 偏度与峰度的正态性分布判断
  3. mfc 窗体不可点击的原因_如何设计一个简单的Access登录窗体(2)
  4. 青光眼-复内路粘小管成形术(ABiC)-转载
  5. 代码里配置java代理
  6. pytorch以特征图的输入方式训练LSTM模型
  7. 一个页面多个ajax统一loading,页面有多个向后台发送的请求加载过程中显示loading,加载完成loading消失...
  8. C#版-百度网盘API的实现(二)
  9. LightOJ 1055 BFS暴力
  10. 前端程序员也需要知道进程和线程
  11. 二维码资料 目录 1. 二维码QR Code 1 2. 发展历程 1 3. 特点 2 4. 存储 3 5. 分类 3 5.1.1. 按原理分 3 6. 区别 与条码区别 5 7. 什么是码制?
  12. 使用路由器搭建局域网
  13. FlashBuild4序列号生成与使用方法
  14. BCNF范式(修正的第三范式)、第四范式和第五范式
  15. webfont应用系列(二)如何制作图标字体?
  16. pygame研究之利用sprite的UI架构实现
  17. Codeforces - King Kog‘s Reception
  18. 【_ 面試 】在单点登录中,如果 cookie 被禁用了怎么办?
  19. 生活需要创意-精彩的水果创意设计
  20. linux 串口操作

热门文章

  1. 如何为新项目创建新的空分支
  2. 将绘图保存到图像文件,而不是使用Matplotlib显示
  3. java对象添加字段_99.9%的Java程序员都说不清的问题:JVM中的对象内存布局?
  4. win11窗口拖动卡顿怎么办 Windows11窗口拖动卡顿的解决方法
  5. 7-2 天梯地图 (30分)_「月夜枫YYF」不会吧不会吧,枫哥失守8000分阵地!
  6. linux将文件的第二列求和,awk实现第一列相乘,第二列求和,并相加 - 米扑博客...
  7. 京东智联云张晓东cdn_京东智联云:数智力量驱动实体经济复苏
  8. python http请求_python模拟http请求
  9. Iconfont的引用与在伪元素中的图标引用
  10. 洛谷——P1009 [NOIP1998 普及组] 阶乘之和