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分页对象使用示例
Apr 01 Javascript
浅析如何利用JavaScript进行语音识别
Oct 27 Javascript
微信小程序 实战实例开发流程详细介绍
Jan 05 Javascript
通过学习bootstrop导航条学会修改bootstrop颜色基调
Jun 11 Javascript
Vue中如何实现轮播图的示例代码
Jul 27 Javascript
用vue2.0实现点击选中active其他选项互斥的效果
Apr 12 Javascript
详解使用Next.js构建服务端渲染应用
Jul 10 Javascript
微信小程序scroll-view实现字幕滚动
Jul 14 Javascript
零基础之Node.js搭建API服务器的详解
Mar 08 Javascript
layui添加动态菜单与选项卡
Jul 26 Javascript
浅谈layui框架自带分页和表格重载的接口解析问题
Sep 11 Javascript
swiper实现导航滚动效果
Dec 13 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 CodeBase:将时间显示为"刚刚""n分钟/小时前"的方法详解
2013/06/06 PHP
学习php设计模式 php实现原型模式(prototype)
2015/12/07 PHP
微信支付开发订单查询实例
2016/07/12 PHP
yii2学习教程之5种内置行为类详解
2017/08/03 PHP
PHP封装XML和JSON格式数据接口操作示例
2019/03/06 PHP
一些常用的Javascript函数
2006/12/22 Javascript
对xmlHttp对象方法和属性的理解
2011/01/17 Javascript
推荐10个超棒的jQuery工具提示插件
2011/10/11 Javascript
Node.js生成HttpStatusCode辅助类发布到npm
2013/04/09 Javascript
获取数组中最大最小值方法js代码(自写)
2013/08/12 Javascript
关于javascript event flow 的一个bug详解
2013/09/17 Javascript
jquery.post用法示例代码
2014/01/03 Javascript
javascript递归回溯法解八皇后问题
2015/04/22 Javascript
Javascript中的return作用及javascript return关键字用法详解
2015/11/05 Javascript
Javascript中作用域的详细介绍
2016/10/06 Javascript
原生js和css实现图片轮播效果
2017/02/07 Javascript
微信小程序商城项目之商品属性分类(4)
2017/04/17 Javascript
JavaScript基于对象方法实现数组去重及排序操作示例
2018/07/10 Javascript
微信小程序使用map组件实现获取定位城市天气或者指定城市天气数据功能
2019/01/22 Javascript
详解如何提升JSON.stringify()的性能
2019/06/12 Javascript
layui 表格操作列按钮动态显示的实现方法
2019/09/06 Javascript
[01:04:01]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS DT第一场
2014/05/24 DOTA
Python 匹配任意字符(包括换行符)的正则表达式写法
2009/10/29 Python
Python中MySQL数据迁移到MongoDB脚本的方法
2016/04/28 Python
深入理解Python变量与常量
2016/06/02 Python
Python内置数据类型list各方法的性能测试过程解析
2020/01/07 Python
Python flask框架端口失效解决方案
2020/06/04 Python
python接入支付宝的实例操作
2020/07/20 Python
NET程序员上机面试题
2015/05/23 面试题
结对共建工作方案
2014/06/02 职场文书
垃圾分类的活动方案
2014/08/15 职场文书
2015年安全员工作总结范文
2015/04/22 职场文书
Python 如何解决稀疏矩阵运算
2021/05/26 Python
GitHub上77.9K的Axios项目有哪些值得借鉴的地方详析
2021/06/15 Javascript
MySQL磁盘碎片整理实例演示
2022/04/03 MySQL
mysql 体系结构和存储引擎介绍
2022/05/06 MySQL