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 相关文章推荐
document.documentElement && document.documentElement.scrollTop
Dec 01 Javascript
用js实现计算加载页面所用的时间
Apr 02 Javascript
用jQuery获取IE9下拉框默认值问题探讨
Jul 22 Javascript
jQuery - css() 方法示例详解
Jan 16 Javascript
node.js下LDAP查询实例分享
Sep 30 Javascript
整理JavaScript创建对象的八种方法
Nov 03 Javascript
全面了解构造函数继承关键apply call
Jul 26 Javascript
Node.js与MySQL交互操作及其注意事项
Oct 05 Javascript
jquery获取select选中值的文本,并赋值给另一个输入框的方法
Aug 21 jQuery
js html实现计算器功能
Nov 13 Javascript
你不知道的 TypeScript 高级类型(小结)
Aug 28 Javascript
js前端图片加载异常兜底方案
Jun 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
在Windows系统上安装PHP运行环境文字教程
2010/07/19 PHP
Array of country list in PHP with Zend Framework
2011/10/17 PHP
Laravel学习笔记之Artisan命令生成自定义模板的方法
2018/11/22 PHP
js form 验证函数 当前比较流行的错误提示
2009/06/23 Javascript
javascript 页面只自动刷新一次
2009/07/10 Javascript
js获取键盘按键响应事件(兼容各浏览器)
2013/05/16 Javascript
等待指定时间后自动跳转或关闭当前页面的js代码
2013/07/09 Javascript
NodeJS的url截取模块url-extract的使用实例
2013/11/18 NodeJs
JavaScript判断访问的来源是手机还是电脑,用的哪种浏览器
2013/12/12 Javascript
JQuery勾选指定name的复选框集合并显示的方法
2015/05/18 Javascript
javascript+HTML5的Canvas实现Lab单车动画效果
2015/08/07 Javascript
jQuery中attr()与prop()函数用法实例详解(附用法区别)
2015/12/29 Javascript
JavaScript简单获取页面图片原始尺寸的方法
2016/06/21 Javascript
Vue数据驱动模拟实现2
2017/01/11 Javascript
Vue + better-scroll 实现移动端字母索引导航功能
2018/05/07 Javascript
详解如何webpack使用DllPlugin
2018/09/30 Javascript
JavaScript格式化json和xml的方法示例
2019/01/22 Javascript
详解javascript函数写法大全
2019/03/25 Javascript
vue项目中定义全局变量、函数的几种方法
2019/11/08 Javascript
Python实现扫描指定目录下的子目录及文件的方法
2014/07/16 Python
使用python telnetlib批量备份交换机配置的方法
2019/07/25 Python
python科学计算之narray对象用法
2019/11/25 Python
在Python中使用MongoEngine操作数据库教程实例
2019/12/03 Python
CSS3实现文字描边的2种方法(小结)
2020/02/14 HTML / CSS
HTML5+CSS3模仿优酷视频截图功能示例
2017/01/05 HTML / CSS
德国便宜的宠物店:Brekz.de
2020/10/23 全球购物
linux面试题参考答案(9)
2015/01/07 面试题
如何写出高质量、高性能的MySQL查询
2014/11/17 面试题
如何用Java判断一个文件或目录是否存在
2012/11/19 面试题
合作意向书模板
2014/03/31 职场文书
村干部四风问题整改措施
2014/09/30 职场文书
精神文明建设汇报材料
2014/12/24 职场文书
违纪检讨书范文
2015/01/27 职场文书
Nginx解决403 forbidden的完整步骤
2021/04/01 Servers
浅谈Redis的keys命令到底有多慢
2021/10/05 Redis
动画「半妖的夜叉姬」新BD特典图公开
2022/03/22 日漫