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 相关文章推荐
js循环改变div颜色具体方法
Jun 25 Javascript
Jquery通过JSON字符串创建JSON对象
Aug 24 Javascript
JavaScript实现N皇后问题算法谜题解答
Dec 29 Javascript
基于JavaScript实现动态添加删除表格的行
Feb 01 Javascript
Vue组件开发之LeanCloud带图形校验码的短信发送功能
Nov 07 Javascript
jQuery 防止相同的事件快速重复触发方法
Feb 08 jQuery
详解使用VueJS开发项目中的兼容问题
Aug 02 Javascript
Vue封装的可编辑表格插件方法
Aug 28 Javascript
详解vue文件中使用echarts.js的两种方式
Oct 18 Javascript
Vue项目中ESlint规范示例代码
Jul 04 Javascript
详解JavaScript中精度失准问题及解决方法
Feb 04 Javascript
详解Vue3 Teleport 的实践及原理
Dec 02 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在线生成二维码代码(google api)
2013/06/03 PHP
php mb_substr()函数截取中文字符串应用示例
2014/07/29 PHP
PHP创建/删除/复制文件夹、文件
2016/05/03 PHP
thinkPHP5.0框架模块设计详解
2017/03/18 PHP
php调用云片网接口发送短信的实现方法
2017/10/25 PHP
Laravel5.5+ 使用API Resources快速输出自定义JSON方法详解
2020/04/06 PHP
javaScript复制功能调用实现方案
2012/12/13 Javascript
Jquery实现兼容各大浏览器的Enter回车切换输入焦点的方法
2014/09/01 Javascript
JavaScript实现简单的二级导航菜单实例
2015/04/15 Javascript
AngularJS中的$watch(),$digest()和$apply()区分
2016/04/04 Javascript
Backbone.js框架中Model与Collection的使用实例
2016/05/07 Javascript
AngularJs Managing Service Dependencies详解
2016/09/02 Javascript
Javascript json object 与string 相互转换的简单实现
2016/09/27 Javascript
Vue.js计算属性computed与watch(5)
2016/12/09 Javascript
JS中Map和ForEach的区别
2018/02/05 Javascript
angular2 组件之间通过service互相传递的实例
2018/09/30 Javascript
小程序显示弹窗时禁止下层的内容滚动实现方法
2019/03/20 Javascript
vue实现axios图片上传功能
2019/08/20 Javascript
[43:51]2014 DOTA2国际邀请赛中国区预选赛 Dream Times VS TongFu
2014/05/22 DOTA
基于Python的关键字监控及告警
2017/07/06 Python
python 定时修改数据库的示例代码
2018/04/08 Python
浅析Python装饰器以及装饰器模式
2018/05/28 Python
Centos 升级到python3后pip 无法使用的解决方法
2018/06/12 Python
分享Python切分字符串的一个不错方法
2018/12/14 Python
Python基于mysql实现学生管理系统
2019/02/21 Python
python3.6中anaconda安装sklearn踩坑实录
2020/07/28 Python
深入CSS3 动画效果的总结详解
2013/05/09 HTML / CSS
Under Armour安德玛德国官网:美国高端运动科技品牌
2019/03/09 全球购物
荷兰度假屋租赁网站:Aan Zee
2020/02/28 全球购物
Yahoo-PHP面试题3
2012/01/14 面试题
初中三年学生的学习自我评价
2013/11/13 职场文书
毕业学生推荐信
2013/12/01 职场文书
阳光体育活动实施方案
2014/05/25 职场文书
环保志愿者活动方案
2014/08/14 职场文书
ElementUI实现el-form表单重置功能按钮
2021/07/21 Javascript
springboot 全局异常处理和统一响应对象的处理方式
2022/06/28 Java/Android