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 相关文章推荐
jquery 打开窗口返回值实现代码
Mar 04 Javascript
基于jQuery实现点击同时更改两个iframe的网址
Jul 01 Javascript
getComputedStyle与currentStyle获取样式(style/class)
Mar 19 Javascript
Javascript遍历Html Table示例(包括内容和属性值)
Jul 08 Javascript
基于MVC5和Bootstrap的jQuery TreeView树形控件(一)之数据支持json字符串、list集合
Aug 11 Javascript
Vue.js每天必学之计算属性computed与$watch
Sep 05 Javascript
vue.js实现数据动态响应 Vue.set的简单应用
Jun 15 Javascript
详解用Node.js实现Restful风格webservice
Sep 29 Javascript
Angular5升级RxJS到5.5.3报错:EmptyError: no elements in sequence的解决方法
Apr 09 Javascript
d3.js实现图形缩放平移
Dec 19 Javascript
element日历calendar组件上月、今天、下月、日历块点击事件及模板源码
Jul 27 Javascript
Vue的列表之渲染,排序,过滤详解
Feb 24 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
用PHP的超级变量$_POST获取HTML表单(HTML Form) 数据
2011/05/07 PHP
thinkphp实现like模糊查询实例
2014/10/29 PHP
PHP执行SQL文件并将SQL文件导入到数据库
2015/09/17 PHP
PHP图形计数器程序显示网站用户浏览量
2016/07/20 PHP
网页中实现浏览器的最大,最小化和关闭按钮
2007/03/12 Javascript
silverlight线程与基于事件驱动javascript引擎(实现轨迹回放功能)
2011/08/09 Javascript
js中的push和join方法使用介绍
2013/10/08 Javascript
JQuery中阻止事件冒泡几种方式及其区别介绍
2014/01/15 Javascript
javascript实现节点(div)名称编辑
2014/12/17 Javascript
jQuery弹簧插件编写基础之“又见弹窗”
2015/12/11 Javascript
JavaScript模拟鼠标右键菜单效果
2020/12/08 Javascript
Vue.js每天必学之组件与组件间的通信
2016/09/08 Javascript
js 递归和定时器的实例解析
2017/02/03 Javascript
bootstrap实现二级下拉菜单效果
2017/11/23 Javascript
jQuery进阶实践之利用最优雅的方式如何写ajax请求
2017/12/20 jQuery
Vue 组件(component)教程之实现精美的日历方法示例
2018/01/08 Javascript
javascript实现前端分页效果
2020/06/24 Javascript
vue中移动端调取本地的复制的文本方式
2020/07/18 Javascript
关于小程序优化的一些建议(小结)
2020/12/10 Javascript
JS实现百度搜索框
2021/02/25 Javascript
浅谈机器学习需要的了解的十大算法
2017/12/15 Python
详解Django+Uwsgi+Nginx的生产环境部署
2018/06/25 Python
Python面向对象类编写细节分析【类,方法,继承,超类,接口等】
2019/01/05 Python
python自动化工具之pywinauto实例详解
2019/08/26 Python
TensorBoard 计算图的可视化实现
2020/02/15 Python
Django数据库操作之save与update的使用
2020/04/01 Python
让你相见恨晚的十个Python骚操作
2020/11/18 Python
详解Python遍历列表时删除元素的正确做法
2021/01/07 Python
Python数据模型与Python对象模型的相关总结
2021/01/26 Python
php优化查询foreach代码实例讲解
2021/03/24 PHP
大学班级文化建设方案
2014/05/06 职场文书
应届生面试求职信
2014/07/02 职场文书
借款协议书
2014/09/16 职场文书
小学2016年第十八届推普周活动总结
2016/04/05 职场文书
mybatis 获取无数据的字段不显示的问题
2021/07/15 Java/Android
CentOS安装Nginx并部署vue
2022/04/12 Servers