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 合并内容相同的单元格(示例代码)
Dec 13 Javascript
使用CSS样式position:fixed水平滚动的方法
Feb 19 Javascript
SeaJS入门教程系列之完整示例(三)
Mar 03 Javascript
jQuery实现图片预加载效果
Nov 27 Javascript
JS Array创建及concat()split()slice()的使用方法
Jun 03 Javascript
基于d3.js实现实时刷新的折线图
Aug 03 Javascript
输入法的回车与消息发送快捷键回车的冲突解决方法
Aug 09 Javascript
vue组件实例解析
Jan 10 Javascript
微信小程序实现动态获取元素宽高的方法分析
Dec 10 Javascript
Vue批量图片显示时遇到的路径被解析问题
Mar 28 Javascript
swiper实现异形轮播效果
Nov 28 Javascript
JavaScript this指向相关原理及实例解析
Jul 10 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的chr和ord函数实现字符加减乘除运算实现代码
2011/12/05 PHP
php如何解决无法上传大于8M的文件问题
2014/03/10 PHP
PHP的password_hash()使用实例
2014/03/17 PHP
PHP基于mcript扩展实现对称加密功能示例
2019/02/21 PHP
jquery入门—选择器实现隔行变色实例代码
2013/01/04 Javascript
Extjs4.0设置Ext.data.Store传参的请求方式(默认为GET)
2013/04/02 Javascript
toggle一个div显示或隐藏且可扩展成自定义下拉框
2013/09/12 Javascript
js插件方式打开pdf文件(浏览器pdf插件分享)
2013/12/20 Javascript
jQuery的cookie插件实现保存用户登陆信息
2014/04/15 Javascript
node.js中的buffer.fill方法使用说明
2014/12/14 Javascript
Javascript writable特性介绍
2015/02/27 Javascript
jQuery实现简单的列表式导航菜单效果代码
2015/08/31 Javascript
使用canvas实现仿新浪微博头像截取上传功能
2015/09/02 Javascript
JavaScript中闭包的写法和作用详解
2016/06/29 Javascript
封装的dialog插件 基于bootstrap模态对话框的简单扩展
2016/08/10 Javascript
JavaScript切换搜索引擎的导航网页搜索框实例代码
2017/06/11 Javascript
利用nodeJs anywhere搭建本地服务器环境的方法
2018/05/12 NodeJs
利用jquery和BootStrap实现动态滚动条效果
2018/12/03 jQuery
自定义Vue组件打包、发布到npm及使用教程
2019/05/22 Javascript
深入理解 JS 垃圾回收
2019/06/03 Javascript
JavaScript获取某一天所在的星期
2019/09/05 Javascript
jquery实现异步文件上传ajaxfileupload.js
2020/10/23 jQuery
[45:52]2018DOTA2亚洲邀请赛 4.1小组赛 A组加赛 LGD vs Liquid
2018/04/02 DOTA
Python利用Django如何写restful api接口详解
2018/06/08 Python
Python实现的爬取小说爬虫功能示例
2019/03/30 Python
Django之编辑时根据条件跳转回原页面的方法
2019/08/21 Python
Python通过两个dataframe用for循环求笛卡尔积
2020/04/29 Python
如何基于Python实现word文档重新排版
2020/09/29 Python
钉钉企业内部H5微应用开发详解
2020/05/12 HTML / CSS
ONLY德国官方在线商店:购买时尚女装
2017/09/21 全球购物
华美博弈C/VC工程师笔试试题
2012/07/16 面试题
测绘工程个人的自我评价
2013/11/10 职场文书
结婚典礼证婚词
2014/01/11 职场文书
大学生村官演讲稿
2014/04/25 职场文书
运动会100米广播稿
2015/08/19 职场文书
JavaScript利用html5新方法操作元素类名详解
2021/11/27 Javascript