JavaScript如何优化逻辑判断代码详解


Posted in Javascript onJune 08, 2021

前言

我们日常使用到的逻辑判断语句有 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: 当不是红色水果时,提前 return

    console.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如何优化逻辑判断代码的文章就介绍到这了,更多相关JavaScript优化逻辑判断代码内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
javascript中拼接HTML字符串的最快、最好的方法
Jun 07 Javascript
教你如何在 Javascript 文件里使用 .Net MVC Razor 语法
Jul 23 Javascript
jquery图形密码实现方法
Mar 11 Javascript
javascript实现简单的全选和反选功能
Jan 05 Javascript
jQuery实现从身份证号中获取出生日期和性别的方法分析
Feb 25 Javascript
前端JS面试中常见的算法问题总结
Dec 23 Javascript
详解vee-validate的使用个人小结
Jun 07 Javascript
基于layui的table插件进行复选框联动功能的实现方法
Sep 19 Javascript
JS数组进阶示例【数组的几种函数用法】
Jan 16 Javascript
jQuery三组基本动画与自定义动画操作实例总结
May 09 jQuery
JavaScript常用8种数组去重代码实例
Sep 09 Javascript
吃通javascript正则表达式
Apr 21 Javascript
浅谈react useEffect闭包的坑
Vue中插槽slot的使用方法与应用场景详析
vue+elementui 实现新增和修改共用一个弹框的完整代码
解决vue $http的get和post请求跨域问题
vue Element-ui表格实现树形结构表格
Jun 07 #Vue.js
Vue中foreach数组与js中遍历数组的写法说明
Jun 05 #Vue.js
浅谈JS的原型和原型链
You might like
php打开远程文件的方法和风险及解决方法
2013/11/12 PHP
php学习笔记之基础知识
2014/11/08 PHP
基于PHP制作验证码
2016/10/12 PHP
jquery+thinkphp实现跨域抓取数据的方法
2016/10/15 PHP
详解php curl带有csrf-token验证模拟提交方法
2018/04/18 PHP
js自定义方法通过隐藏iframe实现文件下载
2013/02/21 Javascript
jquery ajax应用中iframe自适应高度问题解决方法
2014/04/12 Javascript
jquery单击事件和双击事件冲突解决方案
2016/03/02 Javascript
关于Angular2 + node接口调试的解决方案
2017/05/28 Javascript
js+html获取系统当前时间
2017/11/10 Javascript
react写一个select组件的实现代码
2019/04/03 Javascript
Vue+Django项目部署详解
2019/05/30 Javascript
解决Vue打包后访问图片/图标不显示的问题
2019/07/25 Javascript
Vue调用后端java接口的实例代码
2019/10/28 Javascript
Vue中rem与postcss-pxtorem的应用详解
2019/11/20 Javascript
vue基于v-charts封装双向条形图的实现代码
2019/12/09 Javascript
element日历calendar组件上月、今天、下月、日历块点击事件及模板源码
2020/07/27 Javascript
[01:00:17]DOTA2-DPC中国联赛 正赛 SAG vs Dynasty BO3 第二场 1月25日
2021/03/11 DOTA
python通过ElementTree操作XML获取结点读取属性美化XML
2013/12/02 Python
Python创建xml的方法
2015/03/10 Python
python下调用pytesseract识别某网站验证码的实现方法
2016/06/06 Python
python生成大写32位uuid代码
2020/03/03 Python
Django 拼接两个queryset 或是两个不可以相加的对象实例
2020/03/28 Python
python3 配置logging日志类的操作
2020/04/08 Python
浅谈tensorflow使用张量时的一些注意点tf.concat,tf.reshape,tf.stack
2020/06/23 Python
Python Opencv轮廓常用操作代码实例解析
2020/09/01 Python
迪卡侬荷兰官网:Decathlon荷兰
2017/10/29 全球购物
采用怎样的方法保证数据的完整性
2013/12/02 面试题
文秘专业自荐信
2013/10/14 职场文书
2014年迎新年联欢会活动策划方案
2014/02/26 职场文书
优秀经理获奖感言
2014/03/04 职场文书
抗洪抢险事迹材料
2014/05/06 职场文书
2014年镇党建工作汇报材料
2014/11/02 职场文书
2016入党积极分子心得体会
2016/01/06 职场文书
财务年终工作总结大全
2019/06/20 职场文书
基于Redis实现分布式锁的方法(lua脚本版)
2021/05/12 Redis