当前位置: 首页 > news >正文

【JS代码规范】如何优化if-else代码规范

1. 快速结束,减少没必要的else

案例一:2种互斥的条件判断

function test(data) {let result = '';if (data < 0) {result = '负数';} else {result = '非负数';}return result;
}

优化一:

function test(data) {if (data < 0) {return '负数';} return '非负数';
}

优化二:三元表达式

function test(data) {return data < 0 ? '负数' : '非负数';
}

案例二:多种互斥的条件判断

function test(data) {let result = '';if (data < 0) {result = '负数';} else if (data === 0) {result = '0';} else {result = '正数';}return result;
}

这个函数可以进一步简化,可以去掉不必要的变量 result,并直接在 if-else 结构中返回结果。这样可以减少代码行数并使代码更加简洁。以下是优化后的函数:

function test(data) {if (data < 0) {return '负数';} else if (data === 0) {return '0';} return '正数';
}

在这个优化后的函数中,我们直接在每个条件分支中使用 return 语句来返回结果,而不再使用 result 变量。这样可以使代码更加清晰简洁。

案例三:前提条件检查

保护子句是一种防御性编程技术,用于处理可能导致程序失败的输入或条件。在这种情况下,我们可以添加输入值的检查,以确保方法在接收到有效输入后才继续执行

如果入参只能是 0和1 ,那么其他的入参没有必要去判断,用return终止

function test(data) {if (data < 0) throw new Error("invalid arguments");if(data > 1) throw new Error("invalid arguments");return data === 0?"default":"admin";
}

2. 多种条件相同的处理

function region(province) {let result = '';if (province === '广东' ||province === '广西' ||province === '福建' ||province === '浙江' ||province === '云南') {result = '南方';}if (province === '河北' ||province === '黑龙江' ||province === '辽宁' ||province === '山东' ||province === '吉林') {result = '北方';}
}

优化一:switch case

function region(province) {switch (province) {case '广东':case '广西':case '福建':case '浙江':case '云南':return '南方';case '河北':case '黑龙江':case '辽宁':case '山东':case '吉林':return '北方';default:return '未知';}
}

优化二:对象字面量或者 Map 结构

您可以优化这个函数,使用对象字面量或者 Map 结构来存储省份和对应的地区信息,以减少重复的比较。以下是一个优化后的版本:

function region(province) {const regionMap = {'广东': '南方','广西': '南方','福建': '南方','浙江': '南方','云南': '南方','河北': '北方','黑龙江': '北方','辽宁': '北方','山东': '北方','吉林': '北方'};return regionMap[province] || '未知'; // 返回对应省份的地区信息,如果未知则返回'未知'
}

优化三:数组 includes

另一种优化方式是将省份和地区的映射关系分组存储,而不是逐个列举所有省份。这样可以使代码更具可扩展性和易维护性。以下是另一种优化后的版本:

function region(province) {const regions = {'南方': ['广东', '广西', '福建', '浙江', '云南'],'北方': ['河北', '黑龙江', '辽宁', '山东', '吉林']};for (const region in regions) {if (regions[region].includes(province)) {return region;}}return '未知';
}

3. 策略模式 多种条件,条件是常量

案例一:按照不同的事件类型,处理不同的事件

function handleEvent(eventType) {if (eventType=== 'click') {handleClickEvent();} else if (eventType=== 'hover') {handleHoverEvent();} else if (eventType=== 'keyup') {handleKeyEvent();} else {handleDefaultEvent();}
}

优化一:

function handleEvent(eventType) {switch (eventType) {case 'click':handleClickEvent();break;case 'hover':handleHoverEvent();break;case 'keyup':handleKeyEvent();break;default:handleDefaultEvent();}
}

进一步优化:

策略模式:

function handleEvent(eventType) {const eventHandlers = {'click': handleClickEvent,'hover': handleHoverEvent,'keyup': handleKeyEvent};const eventHandler = eventHandlers[eventType] || handleDefaultEvent;eventHandler();
}

4. 多种条件嵌套

假设我们有一个简单的电商网站,根据用户的购物车中商品的种类和总金额来给用户不同的折扣。以下是一个使用 if-else 实现多个条件判断和子条件判断的示例:

function calculateDiscount(cartItems, totalAmount) {let discount = 0;if (cartItems.length >= 3) {if (totalAmount > 100) {discount = 0.2; // 20% discount for more than 3 items and total amount over 100} else {discount = 0.1; // 10% discount for more than 3 items and total amount 100 or less}} else {if (totalAmount > 50) {discount = 0.15; // 15% discount for 3 or fewer items and total amount over 50} else {discount = 0; // No discount for 3 or fewer items and total amount 50 or less}}return discount;
}

在这个示例中,根据购物车中商品的种类和总金额来计算折扣。通过嵌套的 if-else 语句,根据不同的条件组合来计算不同的折扣值。这种方式可以根据不同条件灵活地计算折扣,但随着条件的增加,代码会变得复杂且难以维护。

优化:将不同的折扣规则存储在一个数组。

function calculateDiscount(cartItems, totalAmount) {let discount = 0;const isCartItemsMoreThan3 = cartItems.length >= 3;const isTotalMorethen100 = totalAmount > 100;const discountArr = [{ isCartItemsMoreThan3: true, isTotalMorethen100: true, discount: 0.2 },{isCartItemsMoreThan3: true,isTotalMorethen100: false,discount: 0.1,},{isCartItemsMoreThan3: false,isTotalMorethen100: true,discount: 0.15,},{isCartItemsMoreThan3: false,isTotalMorethen100: false,discount: 0,},];discount = discountArr.filter((item) =>item.isCartItemsMoreThan3 === isCartItemsMoreThan3 &&item.isTotalMorethen100 === isTotalMorethen100)[0].discount;return discount;
}

相关文章:

【JS代码规范】如何优化if-else代码规范

1. 快速结束&#xff0c;减少没必要的else 案例一&#xff1a;2种互斥的条件判断 function test(data) {let result ;if (data < 0) {result 负数;} else {result 非负数;}return result; }优化一&#xff1a; function test(data) {if (data < 0) {return 负数;} …...

MovieLife 电影生活

MovieLife 电影生活 今天看到一个很有意思的项目&#xff1a;https://www.lampysecurity.com/post/the-infinite-audio-book “我有一个看似愚蠢的想法。通常&#xff0c;这类想法只是一闪而过&#xff0c;很少会付诸实践。但这次有所不同。假如你的生活是一部电影&#xff0c…...

网工内推 | 中级云运维工程师,双休,五险一金

01 博达人才 &#x1f537;招聘岗位&#xff1a;中级云运维工程师 &#x1f537;岗位职责 1、受理数据中心、云租户投诉、受理故障工单&#xff0c;并在时限内完成。 2、协助客户开通云产品&#xff0c;解答客户使用过程中的疑问。 3、处理云产品故障&#xff0c;协助进行故…...

Thingsboard规则链:Related Entity Data节点详解

引言 在复杂的物联网&#xff08;IoT&#xff09;生态系统中&#xff0c;数据的集成与分析是实现高效管理和智能决策的基础。Thingsboard作为一个强大的开源物联网平台&#xff0c;其规则链&#xff08;Rule Chains&#xff09;机制允许用户构建自定义的数据处理流程。其中&am…...

C++结尾

面试题 1.什么是虚函数&#xff1f;什么是纯虚函数 在定义函数时前面加virtual。虚函数是为了&#xff0c;父子类中只有一个该函数。如果在子类重写虚函数&#xff0c;那么用的就是子类重写的虚函数&#xff1b;如果子类没有重写虚函数&#xff0c;那么调用的是父类继承的虚函…...

Flutter鸿蒙化环境配置(windows)

Flutter鸿蒙化环境配置&#xff08;windows&#xff09; 参考资料Window配置Flutter的鸿蒙化环境下载配置环境变量HarmonyOS的环境变量配置配置Flutter的环境变量Flutter doctor -v 检测的问题flutter_flutter仓库地址的警告问题Fliutter doctor –v 报错[!] Android Studio (v…...

Vue入门之生命周期

文章目录 一、Vue 生命周期概述二、生命周期的四个阶段1. 创建阶段2. 挂载阶段3. 更新阶段4. 销毁阶段 三、代码案例四、总结 在 Vue 开发中&#xff0c;理解生命周期是非常重要的。Vue 的生命周期可以帮助我们在不同的阶段执行特定的逻辑&#xff0c;从而更好地控制组件的行为…...

UNI-SOP应用场景(1)- 纯前端预开发

在平时新项目开发中&#xff0c;前端小伙伴是否有这样的经历&#xff0c;hi&#xff0c;后端小伙伴们&#xff0c;系统啥时候能登录&#xff0c;啥时候能联调了&#xff0c;这是时候往往得到的回答就是&#xff0c;再等等&#xff0c;我们正在搭建系统呢&#xff0c;似曾相识的…...

力扣9.23

1014. 最佳观光组合 给你一个正整数数组 values&#xff0c;其中 values[i] 表示第 i 个观光景点的评分&#xff0c;并且两个景点 i 和 j 之间的 距离 为 j - i。 一对景点&#xff08;i < j&#xff09;组成的观光组合的得分为 values[i] values[j] i - j &#xff0c;…...

[Redis][事务]详细讲解

目录 0.什么是事务&#xff1f;1.Redis 事务本质2.Redis 事务意义3.事务操作1.MULTI2.EXEC3.DISCARD4.WATCH5.UNWATCH 0.什么是事务&#xff1f; Redis的事务和MySQL的事务概念上是类似的&#xff0c;都是把一系列操作绑定成一组&#xff0c;让这一组能够批量执行Redis事务和M…...

Latex——一行的划线 如何分开

代码&#xff1a; \cmidrule(r){3-4} \cmidrule(r){5-6} \cmidrule(r){7-8}效果&#xff1a; 参考文章&#xff1a; LaTeX技巧653&#xff1a;如何隔开LaTeX表格邻近\cline表格线&#xff1f;...

大数据:快速入门Scala+Flink

一、什么是Scala Scala 是一种多范式编程语言&#xff0c;它结合了面向对象编程和函数式编程的特性。Scala 这个名字是“可扩展语言”&#xff08;Scalable Language&#xff09;的缩写&#xff0c;意味着它被设计为能够适应不同规模的项目&#xff0c;从小型脚本到大型分布式…...

侧边菜单的展开和折叠

环境准备&#xff1a;Vue3Element-UI Plus <script setup> import {ref} from "vue";// 是否折叠菜单&#xff0c;默认折叠 const isCollapse ref(true)</script><template><el-container><el-aside><el-menu:collapse"isCo…...

自动化办公-Python中的for循环

for 循环是 Python 中用于迭代&#xff08;遍历&#xff09;序列&#xff08;如列表、元组、字典、集合、字符串&#xff09;或其他可迭代对象的控制结构。它允许您逐一访问序列中的每个元素&#xff0c;并对其执行操作。以下是对 for 循环的详细介绍&#xff0c;包括语法、使用…...

Python_itertools

itertools itertools.count(start, step) 返回一个无限迭代器&#xff0c;从指定的start开始&#xff0c;每次增加step。 import itertools # 从1开始&#xff0c;每次增加1&#xff0c;输出前5个数 for i in itertools.count(1, 1):if i > 5:breakprint(i)运行结果&#…...

Apache Iceberg 数据类型参考表

Apache Iceberg 概述-链接 Apache Iceberg 数据类型参考表 数据类型描述实例方法注意事项BOOLEAN布尔类型&#xff0c;表示真或假true, false用于条件判断&#xff0c;例如 WHERE is_active true。确保逻辑条件的正确性。INTEGER32位有符号整数42, -7可用于计算、聚合&#xf…...

职责链模式

职责链模式 责任链&#xff08;Chain of Responsibility&#xff09;模式&#xff1a;为了避免请求发送者与多个请求处理者耦合在一起&#xff0c;于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链&#xff1b;当有请求发生时&#xff0c;可将请求沿着这…...

新品 | Teledyne FLIR IIS 推出Forge 1GigE SWIR 短波红外工业相机系列

近日&#xff0c;51camera的合作伙伴Teledyne FLIR IIS推出了新品Forge 1GigE SWIR 130万像素的红外相机。 Forge 1GigE SWIR系列的首款相机配备宽频带、高灵敏度的Sony SenSWIR™️ 130万像素IMX990 InGaAs传感器。这款先进的传感器采用5um像素捕捉可见光和SWIR光谱&#xff…...

深入MySQL:掌握索引、事务、视图、存储过程与性能优化

在掌握了MySQL的基本操作之后&#xff0c;你可能会遇到更复杂的数据管理和优化需求。本文将介绍一些MySQL的进阶特性&#xff0c;包括索引、事务、视图、存储过程和函数、以及性能优化等内容。通过学习这些高级功能&#xff0c;你可以更高效地管理和优化你的数据库。 索引 索…...

【WSL——Windows 上使用 Linux 环境】

引入 以前在windows上使用linux工具链&#xff0c;一般都要安装虚拟机&#xff08;VMware/virtualBox)。虚拟机的缺点是&#xff0c;因为是完整的虚拟环境&#xff0c;消耗系统资源比较多。 windows自己开发了WSL功能&#xff0c;实现了虚拟机的功能&#xff0c;但是比虚拟机性…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

基于matlab策略迭代和值迭代法的动态规划

经典的基于策略迭代和值迭代法的动态规划matlab代码&#xff0c;实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...