兰州装修公司位置/绍兴seo
序:如何让代码看起来更优雅?代码是由文字堆叠起来的可以被机器执行的程序。它记载着相关信息(状态)、表达相关的情绪(函数),所以如何能够写出简洁、优雅、健壮、可维护性强的程序至关重要。本系列笔记的目的,就是带着大家如何实现更有效、更优雅的编程。笔记涵盖:运算符、流程语句、设计模式、ES6 新增方法等多个方面。
1. 逻辑或运算符 ||
逻辑或运算符,也叫短路运算符。当 ||
运算符左边的值为 true 时,则返回左边表达式的值,反之则返回右边表达式的值。如下:
true || false // true
false || true // true
10 > 20 || "Hello" // "Hello"
"" || 0 // 0
undefined || null // null
上面代码是逻辑或最常用的场景,其实基于上面的场景,可以来优化大家经常写的 if…else 代码,如下:
let result
if (a) {result = a
} else {result = b
}
很简单的一段代码,但是使用短路运算符要简洁的多,如下:
let result = a || b
看到这里,是不是有一种 “柳暗花明又一村” 的感觉,那就让我们接着往下看吧。
2. 三元运算符 ? :
提到 if…else 优化,就不得不说一下三元运算符了。这个运算符在替换条件语句的时候也是很好用的。但是注意不要嵌套太多层哦!毕竟嵌套多了,可读性就不强了,也就背离了我们代码优化的目的。
语法格式:
条件表达式 ? 条件表达式成立的值 : 条件表达式不成立的值
这样上面的 if 语句,使用三元运算符表示如下:
let result = a ? a : b
当然,写到这里,见多识广的你可能会想到上面的语句还能再一步优化,这里先卖个关子,大家可以在后面的案例中查找彩蛋。
三元表达式在诸如:条件判断、条件赋值、递归等场景应用也是比较多的。如下,实现一个累加函数:
使用条件语句实现
let sum = 0;
function increment (n) {sum += nif (n === 1) return sumelse return increment(n - 1)
}
使用三元运算符实现
let sum = 0;
function increment (n) {sum += nreturn n >= 2 ? increment(n - 1) : sum
}
3. 对象/数组配置
对于条件复杂的多重判断,三元运算符可读性不强,条件语句和选择语句可以实现,但是写起来很麻烦,代码变得很臃肿。如下:
条件语句实现:
let dayNum = 1
let getWeekDay = (dayNum) => {if (dayNum === 7) {return "星期日"} else if (dayNum === 1) {return "星期一"} else if (dayNum === 2) {return "星期二"} else if (dayNum === 3) {return "星期三"} else if (dayNum === 4) {return "星期四"} else if (dayNum === 5) {return "星期五"} else if (dayNum === 6) {return "星期六"} else {return "不是合法的值"}
}
选择语句实现:
let result;
switch (dayNum) {case 0: result = "星期日"breakcase 1: result = "星期一"breakcase 2: result = "星期二"breakcase 3: result = "星期三"breakcase 4: result = "星期四"breakcase 5: result = "星期五"breakcase 6: result = "星期六"breakdefault:result = "不是合法的值"break
}
return result;
看到这里,你应该已经不想看了,不禁吐槽:这也太麻烦了吧!是的,所以我们想办法优化他吧,比方把相关的数据封装到数组或者对象中,然后取对应的值呢?
数组方式实现:
let days = ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"]
let result = days[dayNum] ?? "不是合法的值"
对象方式实现:
let days = {0: "星期日",1: "星期一",2: "星期二",3: "星期三",4: "星期四",5: "星期五",6: "星期六",
}
let result = days[dayNum] ?? "不是合法的值"
这样的代码,在你看来是不是有一种“神清气爽”的感觉。ES6 中新增 Map 对象,我们同样可以使用 Map 来实现上面的功能,原理都是一样的。
let days = new Map([[0, "星期日"],[1, "星期一"],[2, "星期二"],[3, "星期三"],[4, "星期四"],[5, "星期五"],[6, "星期六"]
])
let result = days.get(dayNum) || "不是合法的值"
4. 复杂条件分支优化
上面所列举的都是一些比较简单直接的判断条件,如果判断条件过于复杂,那么我们应该如何去处理呢?先看下面这段改造代码:
let days = {0: () => "星期日",1: () => "星期一",2: () => "星期二",3: () => "星期三",4: () => "星期四",5: () => "星期五",6: () => "星期六",
}
let result = days[dayNum] ? days[dayNum]() : "不是合法的值"
看过上面的代码,你可能会说这不还是 key-value
形式吗,无非就是多了一步,需要执行函数才能获得对应的值。没错,但是这样的好处是,你可以在对应的函数中执行任何你想实现的逻辑,相对更加灵活一些。
那么,回过头了,我们继续说复杂条件分支的优化问题,如下:
let score = 98;
let getResult = (score) => {if (score <= 100 && score >= 90) {return "优秀"} else if (score < 90 && score >= 80) {return "良好"} else if (score < 80 && score >= 70) {return "中等"} else if (score < 70 && score >= 60) {return "及格"} else if (score < 60 && score >= 0) {return "不及格"} else {return "非法字符"}
}
很明显,上面判断的条件表达式不再是简单的等值判断了,像这种情况,我们依旧可以按照上面的思想进行优化改造。可以考虑使用二维数组实现。
二维数组方式:
let scores = [[(score) => score <= 100 && score >= 90, () => "优秀"],[(score) => score <= 90 && score >= 80, () => "良好"],[(score) => score <= 80 && score >= 70, () => "中等"],[(score) => score <= 70 && score >= 60, () => "及格"],[(score) => score <= 60 && score >= 0, () => "不及格"]
]
let getResult = (score) => {// 判断符合条件的子数组let obj = scores.find(v => v[0](score))// 子数组存在,则运行数组中第二个函数元素,否则返回其它信息let result = obj ? obj[1]() : "非法字符"return result;
}
这里注重的是最终得到的结果,而不是获得结果的过程。当今硬件性能过剩下情况下,我们通过这种更加优雅、简洁、可维护性的方式来获取最终想要的结果,显然是更可取的。
你要记住:优雅永不过时,浪漫至死不渝。
好了,到这里《JS代码优化一》分享就已经结束了,如果感觉还不错记得点赞收藏。你还知道哪些代码优化的方案呢?那就写出来把。
相关文章:

【JS代码优化一】分支优化篇
序:如何让代码看起来更优雅?代码是由文字堆叠起来的可以被机器执行的程序。它记载着相关信息(状态)、表达相关的情绪(函数),所以如何能够写出简洁、优雅、健壮、可维护性强的程序至关重要。本系…...

软件测试-接口测试-补充
文章目录 1.持续集成2. mock测试3.Fiddler 抓包工具3.1 弱网测试4. webservice1.持续集成 持续集成概念 重复执行开发提交代码并集成到主干; aim 加速产品迭代 好处 快速发现问题 避免分支大幅度偏离主干 加速产品发布 工具 git:源代码版本工具github:代码仓库jenkins:持续…...

Spring笔记(5):Beans自动装配
为什么需要使用自动装配 在通过XML配置文件进行设置Bean元素注入与声明注册后,我们能够发现一个问题,在项目中是会存在大量对象的,不可能全部都写在XML文件中,那会显得非常的臃肿,不利于后期维护,所以需要用…...

Spark+Vue+Springboot 协同过滤额音乐推荐大数据深度学习项目
一、项目背景 随着互联网的发展,大数据的到来,传统的音乐行业受到了很大的冲击,原有的音乐数字化给人们生活带来了极大的便利。随着数字音乐的兴起,各大音乐平台层出不穷,人们在音乐平台上收听音乐的时,常常因为歌曲信息繁杂,而不能找到自己想听的音乐。为了解决这个问题,音乐…...

JDBC的实现(IDEA版)
前期准备 开发环境: IDEA 2021.1.3 JAVA 1.8 MYSQL 8.0.32 msql用户名:root 密码:123 下载MySQL JDBC 驱动 前往MySQL官网下载对应版本的MySQL Connector/J驱动 (下载地址:https://dev.mysql.com/downloads/connector/j/ÿ…...

人员摔倒识别预警系统 人员跌倒检测算法 yolov7
人员摔倒识别预警系统 人员跌倒检测算法基于yolov7网络模型计算机识别技术,人员摔倒识别预警系统 人员跌倒检测算法对画面中人员摔倒进行实时检测识别抓拍告警。YOLOv7 的策略是使用组卷积来扩展计算块的通道和基数。研究者将对计算层的所有计算块应用相同的组参数和…...

Spring-Cloud-Gateway集成Nacos如何做负载均衡?
spring-cloud-alibaba的低版本 如果所用的SpringCloud和Nacos的版本信息如下: <spring-cloud.version>Hoxton.SR10</spring-cloud.version> <spring-cloud-alibaba.version>2.2.6.RELEASE</spring-cloud-alibaba.version>网关的依赖如下&…...

【数据挖掘与商务智能决策】第四章 逻辑回归模型
逻辑回归模型算法原理 逻辑回归模型的数学原理 %matplotlib inline# 补充知识点:Sigmoid函数绘制 import matplotlib.pyplot as plt import numpy as npx = np.linspace(-6, 6) # 通过linspace()函数生成-6到6的等差数列,默认50个数 y = 1.0...

滚动升级回滚
滚动升级回滚 ReplicationController 资源文件 apiVersion: v1 kind: ReplicationController metadata:name: kubia-v1labels:app: kubia spec:replicas: 3template:metadata:name: kubialabels:app: kubiaspec:containers:- image: luksa/kubia:v1name: nodejes --- apiVer…...

2023/3/6 VUE - 组件传值【通信】方式
1 父亲传子代传值【子代使用父代的数据】 1.1 props传值 父亲给儿子传值: 爷爷给孙子传值: 这个props传值的方式,只能一代一代的往下传,不能跨代传值。 有一个问题:子组件不能修改父组件的值: 1.2 …...

MedCalc v20.217 医学ROC曲线统计分析参考软件
MedCalc是一款医学 ROC 曲线统计软件,用于ROC曲线分析的参考软件,医学工作者设计的医学计算器,功能齐全。它可以帮助医生快速作出普通的医学计算,从而对症下药。提供超过76种常用的规则和方法,包括:病人数据、单位参数、费用计算等等。甚至可以将图形另存为BMP,PNG,GIF…...

欢乐消除开心假日协议解密
欢乐消除开心假日协议解密协/议/流/量/解/密分析欢乐消除开心假日这款游戏流量的协议加密方式。序欢乐消除开心假日是一款合成模拟家装的游戏,在这个游戏中,你将成为一位充满热情的设计师,与好友一起经营工作室。你需要根据客户的需求重新设计…...

Android Service知识
一. 概览 Service 是一种可在后台执行长时间运行操作而不提供界面的应用组件。服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行。此外,组件可通过绑定到服务与之进行交互,甚至是执行进程间通信 (IPC…...

axios的get请求传入数组参数后端无法接收的问题
问题描述 在做项目时,需要把前端的数组通过axios的get请求发送到后端处理,于是像这样直接发送: axios.get(url,{params:{arr: update_arr}})这时在后端接收后报错说:没有 ‘arr’ 这个key: arr request.GET[arr] pr…...

奖金发放-课后程序(Python程序开发案例教程-黑马程序员编著-第3章-课后作业)
实例2:奖金发放 某企业发放的奖金是根据利润和提成计算的,其规则如表1所示。 表1 奖金发放规则 利润(万元) 奖金提成(%) I≤10 10% 10<I≤20 7.5% 20<I≤20 5% 10…...

第十四届蓝桥杯第三期模拟赛 【python】
第十四届蓝桥杯第三期模拟赛 【python】 文章目录第十四届蓝桥杯第三期模拟赛 【python】✨最小的十六进制(python的16进制)❓️问题描述答案提交🧠思路🖥︎参考答案✨Excel的列(进制转化)❓️问题描述答案…...

Python——函数(重点内容)
函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。 函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫…...

2023年如何在Google做外贸
2023年如何在Google做外贸 答案是:利用谷歌SEO获取自然流量促进成交。 随着全球化和数字化的发展,外贸行业越来越重视互联网的渠道拓展。 在Google搜索引擎上做好SEO优化,是吸引国际客户和提高品牌知名度的关键。 本文将探讨2023年如何在…...

Linux操作系统学习(线程池)
文章目录线程池线程池原理代码示例单例模式饿汉模式懒汉模式饿汉懒汉对比其他的锁线程池 线程池原理 线程池是一种线程使用模式。在多线程应用中,若每有一个任务,线程就去调度相应的函数去创建,当任务过多时,每次都去调度且每…...

JVM运行时数据区—Java虚拟机栈
虚拟机栈的背景 由于跨平台性的设计,java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。 根据栈设计的优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功…...

gitlab中文社区
1、获取gitlab中文社区项目 中文社区版项目:https://gitlab.com/xhang/gitlab 2、克隆中文仓库 git clone https://gitlab.com/xhang/gitlab.git 3、查看gitlab版本 diff 获取对应版本的中文 head -1 /opt/gitlab/version-manifest.txt #安装的是gitlab-ce…...

深度学习-第T2周——彩色图片分类
深度学习-第T2周——彩色图片分类深度学习-第P1周——实现mnist手写数字识别一、前言二、我的环境三、前期工作1、导入依赖项并设置GPU2、导入数据集3、归一化4、可视化图片四、构建简单的CNN网络五、编译并训练模型1、设置超参数2、编写训练函数六、预测七、模型评估深度学习-…...

GNU C编译器扩展关键字:__attribute__
目录 一、section 二、aligned 三、packed 四、format 五、weak 六、alias 七、noinline和always_inline GNU C增加了一个__attribute__关键字用来声明一个函数、变量或类型的特殊属性,可以知道编译器在编译过程中进行特定方面的优化或代码检查。 目前&…...

C++基础 | 从C到C++快速过渡
一、开发环境 c使用的编译器是g。 vim或者vscodeclionVS 二、C版本的Hello World /*** brief c版本helloworld示例* author Mculover666* date 2023/2/26*/#include <iostream> using namespace std;int main() {int a 1;double b 3.14;char c[] "str…...

【C++】仿函数 -- priority_queue
文章目录一、priority_queue 的介绍和使用1、priority_queue 的介绍2、priority_queue 的使用3、priority_queue 相关 OJ 题二、仿函数1、什么是仿函数2、仿函数的作用三、priority_queue 的模拟实现一、priority_queue 的介绍和使用 1、priority_queue 的介绍 priority_queu…...

盘一盘C++的类型描述符(一)
前言 C的类型描述方式是从C语言继承来的,并且进行了扩充(例如引用、非静态成员函数、模板实参等)。但由于C语言中的类型描述方式就略微有点「反人类」,再经C扩展后就有点「反碳基生物」了~ 是的,当我第一次看到这种描…...

Peppol的发展史和基本框架
Peppol(Pan-European Public Procurement Online)是欧洲区域内的一个跨境公共采购电子商务平台试点项目,由欧盟委员会和Peppol联盟成员国共同资助建立,旨在通过制定标准化框架,推动欧盟成员国在公共采购相关的电子目录…...

Linux-GCC介绍+入门级Makefile使用
前言(1)我们都知道,在Linux中编译.c文件需要使用gcc -o .c文件的指令来将C文件变成可执行文件。但是我们有没有发现,如果我们需要编译大一点的工程,后面需要加上的.c文件是不是太多了?感觉非常的麻烦。&…...

iOS(一):Swift纯代码模式iOS开发入门教程
Swift纯代码模式iOS开发入门教程项目初始化(修改为纯代码项目)安装第三方库(以SnapKit库为例)桥接OC库(QMUIKit)封装视图并进行导航跳转示例:使用 TangramKit 第三方UI布局库应用国际化添加 R.s…...

IDEA+Python+Selenium+360浏览器自动化测试
环境配置前提,见文章https://mp.csdn.net/mp_blog/creation/editor/new?spm1001.2101.3001.4503下载360浏览器,并下载对应版本的chromedriver.exe,下载地址http://chromedriver.storage.googleapis.com/index.html下载好360浏览器࿰…...