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 Cookie 直接浏览网站分网址
Dec 08 Javascript
jQuery操作Select的Option上下移动及移除添加等等
Nov 18 Javascript
谈谈JavaScript的New关键字
Aug 26 Javascript
浅谈javascript:两种注释,声明变量,定义函数
Sep 29 Javascript
Bootstrap中datetimepicker使用小结
Dec 28 Javascript
基于Node的React图片上传组件实现实例代码
May 10 Javascript
jQuery实现浏览器之间跳转并传递参数功能【支持中文字符】
Mar 28 jQuery
微信小程序实现上传图片功能
May 28 Javascript
js canvas实现橡皮擦效果
Dec 20 Javascript
详解vue 动态加载并注册组件且通过 render动态创建该组件
May 30 Javascript
vue+elementUi图片上传组件使用详解
Aug 20 Javascript
vue-calendar-component 封装多日期选择组件的实例代码
Dec 04 Vue.js
浅谈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
mysql5写入和读出乱码解决
2006/11/25 PHP
php 生成短网址原理及代码
2014/01/23 PHP
php实现购物车功能(上)
2020/07/23 PHP
PHP flush 函数使用注意事项
2016/08/26 PHP
PDO::setAttribute讲解
2019/01/29 PHP
根据判断浏览器类型屏幕分辨率自动调用不同CSS的代码
2007/02/22 Javascript
学习ExtJS border布局
2009/10/08 Javascript
浅说js变量
2011/05/25 Javascript
EasyUI的treegrid组件动态加载数据问题的解决办法
2011/12/11 Javascript
Javascript 实现的数独解题算法网页实例
2013/10/15 Javascript
Jquery $.getJSON 在IE下的缓存问题解决方法
2014/10/10 Javascript
Js获取当前日期时间及格式化代码
2016/09/17 Javascript
微信小程序 window_x64环境搭建
2016/09/30 Javascript
JS中用try catch对代码运行的性能影响分析
2016/12/26 Javascript
利用js判断手机是否安装某个app的多种方案
2017/02/13 Javascript
详解vue mint-ui源码解析之loadmore组件
2017/10/11 Javascript
详解微信小程序框架wepy踩坑记录(与vue对比)
2019/03/12 Javascript
Openlayers实现地图的基本操作
2020/09/28 Javascript
Python的gevent框架的入门教程
2015/04/29 Python
浅谈Python类的__getitem__和__setitem__特殊方法
2016/12/25 Python
Python3之文件读写操作的实例讲解
2018/01/23 Python
Python中property属性实例解析
2018/02/10 Python
Python并行分布式框架Celery详解
2018/10/15 Python
python实现简单的单变量线性回归方法
2018/11/08 Python
Python中extend和append的区别讲解
2019/01/24 Python
树莓派4B+opencv4+python 打开摄像头的实现方法
2019/10/18 Python
Python中pyecharts安装及安装失败的解决方法
2020/02/18 Python
Django模板之基本的 for 循环 和 List内容的显示方式
2020/03/31 Python
初学者学习Python好还是Java好
2020/05/26 Python
世界上最好的旅行夹克:BauBax
2018/12/23 全球购物
高二物理教学反思
2014/02/08 职场文书
单位接收函格式
2015/01/30 职场文书
2015年社区统计工作总结
2015/04/21 职场文书
教师学习中国梦心得体会
2016/01/05 职场文书
python中24小时制转换为12小时制的方法
2021/06/18 Python
DE1103使用报告
2022/04/05 无线电