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 相关文章推荐
13 个JavaScript 性能提升技巧分享
Jul 26 Javascript
jquery焦点图片切换(数字标注/手动/自动播放/横向滚动)
Jan 24 Javascript
javascript自启动函数的问题探讨
Oct 05 Javascript
jquery处理json对象
Nov 03 Javascript
JQuery删除DOM节点的方法
Jun 11 Javascript
JQ实现新浪游戏首页幻灯片
Jul 29 Javascript
发布一款npm包帮助理解npm的使用
Jan 03 Javascript
JavaScript学习笔记之图片库案例分析
Jan 08 Javascript
关于vue状态过渡transition不起作用的原因解决
Apr 09 Javascript
vue中利用simplemde实现markdown编辑器(增加图片上传功能)
Apr 29 Javascript
Vue实现手机扫描二维码预览页面效果
May 28 Javascript
vue实现多个echarts根据屏幕大小变化而变化实例
Jul 19 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 常用数组内部函数(Array Functions)介绍
2013/06/05 PHP
thinkPHP实现瀑布流的方法
2014/11/29 PHP
简单谈谈PHP中的Reload操作
2016/12/12 PHP
PHP 500报错的快速解决方法
2016/12/14 PHP
js解决弹窗问题实现班级跳转DIV示例
2014/01/06 Javascript
jQuery CSS()方法改变现有的CSS样式表
2014/09/09 Javascript
js使用DOM操作实现简单留言板的方法
2015/04/10 Javascript
详解AngularJS中的依赖注入机制
2015/06/17 Javascript
AngularJS实现按钮提示与点击变色效果
2016/09/07 Javascript
深入理解Angularjs向指令传递数据双向绑定机制
2016/12/31 Javascript
简单谈谈vue的过渡动画(推荐)
2017/10/11 Javascript
Vue组件开发技巧总结
2018/03/04 Javascript
从零到一详聊创建Vue工程及遇到的常见问题
2019/04/25 Javascript
JS中async/await实现异步调用的方法
2019/08/28 Javascript
详解关于Vue单元测试的几个坑
2020/04/26 Javascript
Vue.js中Line第三方登录api的实现代码
2020/06/29 Javascript
深入理解Python对Json的解析
2017/02/14 Python
python requests 使用快速入门
2017/08/31 Python
python 每天如何定时启动爬虫任务(实现方法分享)
2018/05/21 Python
python3模拟实现xshell远程执行liunx命令的方法
2019/07/12 Python
Python代码实现http/https代理服务器的脚本
2019/08/12 Python
Django通过dwebsocket实现websocket的例子
2019/11/15 Python
TensorFlow学习之分布式的TensorFlow运行环境
2020/02/05 Python
使用python脚本自动生成K8S-YAML的方法示例
2020/07/12 Python
python如何支持并发方法详解
2020/07/25 Python
英国鞋网:Rubber Sole
2020/03/03 全球购物
程序员经常用到的UNIX命令
2015/04/13 面试题
大学生入党思想汇报
2014/01/14 职场文书
幼儿教师师德演讲稿
2014/05/06 职场文书
三好学生先进事迹材料
2014/08/28 职场文书
自愿离婚协议书范本
2014/09/13 职场文书
2014镇党委班子对照检查材料思想汇报
2014/09/23 职场文书
2014年学生会个人工作总结
2014/11/07 职场文书
OpenCV实现反阈值二值化
2021/11/17 Java/Android
微信小程序结合ThinkPHP5授权登陆后获取手机号
2021/11/23 PHP
Centos7 Shell编程之正则表达式、文本处理工具详解
2022/08/05 Servers