JavaScript 代码整洁之道
文章目录
- 概述篇
- 变量篇
- 函数篇
- 注释篇
- 异常处理篇
- 复杂判断
- 函数篇
- 重构篇
- 代码风格
- 常量大写
- 先声明后调用
- 注释
参考资料
概述篇
- 书写能让人读懂的代码
- 使用英语编写代码
- 团队协作
制定通用的规则,依靠工具让团队的代码风格保持统一,要让代码看起来是由一个人编写的,消除个人的代码风格。常用工具Prettier。
变量篇
-
变量要名副其实
不要使用x、y那种无意义变量。简单易懂的名字让我们很轻易的知道发生了什么。 -
变量名可以读出来
请不要让我思考那些不是业务逻辑重点的事情! -
不要在名称中使用变量的类型
毫无意义!变量类型的前缀是噪音! -
对同一类型的变量使用相同的词汇表
同一个概念,三种不同的定义。必须自始至终使用统一的命名,不管是user、customer、client,只能用同一个。 -
不要添加不需要的上下文
在变量名称中没有必要添加类或包的相关上下文。
const Car = {carMake: 'Honda',carModel: 'Accord',carColor: 'Blue',
};function paintCar(car) {car.carColor = 'Red';
}const Car = {make: 'Honda',model: 'Accord',color: 'Blue',
};function paint(car) {car.color = 'Red';
}
- 不要使用魔法数字和字符串
在编写代码中,不应该在源代码中直接使用数字或文本字符串,这些通常也被称为魔法数字。
魔法数字或字符串必须存储在常量中,通过对长的名称来表达出他的用途。
// What the heck is 86400000 for?
setTimeout(blastOff, 86400000);
user.rol = 'Administrator';const MILLISECONDS_IN_A_DAY = 86400000;
const ADMINISTRATOR_ROL = 'Administrator';setTimeout(blastOff, MILLISECONDS_IN_A_DAY);
user.rol = ADMINISTRATOR_ROL;
函数篇
注释篇
-
只注释业务逻辑复杂的内容
优秀的代码本身就是注释,通常都能所见即明白。因此,添加注释可以有,但通常不是必需的。
程序中存在一个特定的业务逻辑,我们作为开发人员不知道该逻辑。需要对业务逻辑加上注释。 -
避免日志型注释
以日期为维度的日志型注释是不必要的。这些日志工作应该交给版本控制工具,如 git,通过git log来获取历史记录。 -
避免使用注释去标记位置
应该避免使用注释进行位置标记,因为这种做法通常只会让代码更冗余。
异常处理篇
-
使用异常而非返回码
隔离业务逻辑和错误处理,他们是两个不同的问题,必须要去分开处理和对待。处理程序异常的责任交给变成语言去处理。例如try catch。 -
不要忽视异常处理
==请不要做鸵鸟。==对捕获的错误不做任何处理是没有意义的。 -
不要忽视Promise reject
-
定义异常层次结构
-
提供异常的上下文
复杂判断
-
不要使用标记flag作为函数参数
必须创建两个函数来实现各自对应的逻辑功能,而不是使用一个函数来实现两个逻辑功能,因为他们是不同的功能。 -
封装判断条件
if (platform.state === 'fetching' && isEmpty(cart)) {// ...
}
function showLoading(platform, cart) {return platform.state === 'fetching' && isEmpty(cart);
}if (showLoading(platform, cart)) {// ...
}
-
卫语句Guard Clauses替换嵌套的条件语句
这个建议在程序员的开发中是至关重要的,在开发中不应该有嵌套的条件语句存在。
卫语句是我们避免嵌套条件的主要技术之一,不需要else关键字就可以完美实现。 -
空对象Null Object模式
在初级程序员的代码中可以看到的另一个常见错误,不断检查对象是否为 null,并根据该检查判断是否显示默认操作。这种模式称为空对象模式。 -
使用多态删除条件
绝大多数程序员认为switch控制语句比if语句更简洁,虽然两种不同,但是使用了switch,其实也会提高代码的复杂性,最终会让我们思考太多。
我们可以通过类的继承,为每个特定类型创建一个类,利用多态来避免使用条件判断。 -
使用策略模式/命令模式移除条件
函数篇
- 使用默认参数去代替短路操作或条件赋值
function setName(name) {const newName = name || 'Juan Palomo';
}
function setName(name = 'Juan Palomo') {// ...
}
- 函数参数(理想情况下不多于2个)
当一个函数有很多参数时,可以把这些参数组合在一起构成一个对象。
const burger = {name: 'Chicken',price: 1.25,ingredients: ['chicken'],vegan: false,
};
newBurger(burger);
-
避免副作用-全局变量
避免副作用的最简单方法是将此函数作用范围内的变量都作为参数进行传递。 -
避免副作用-可变对象
另一个非常重要的副作用就是直接修改对象本身,如果你一直从事计算机相关的工作,你会知道 JavaScript 自诞生以来就是支持对象可变的,目前许多库都在尽量避免使用可变对象。 -
函数应该只做一件事
-
函数应该只是有一个抽象级别
-
优先考虑函数式编程而不是命令式编程
-
函数链式调用
重构篇
重构:重构不是银弹,但它是一种有价值的武器,可以帮助你控制好代码和项目 (软件/应用)。
代码风格
参考文档
常量大写
const DAYS_IN_WEEK =7;
const DAYS_IN_MONTH=30;
先声明后调用
为了方便阅读,把函数声明写在函数调用前面。
注释
只有业务逻辑需要注释。代码注释不是越多越好。
相关文章:

JavaScript 代码整洁之道
文章目录 概述篇变量篇函数篇注释篇异常处理篇复杂判断函数篇重构篇代码风格常量大写先声明后调用注释 参考资料 概述篇 书写能让人读懂的代码使用英语编写代码团队协作 制定通用的规则,依靠工具让团队的代码风格保持统一,要让代码看起来是由一个人编写…...

socket 及 字节序转换(嵌入式学习)
socket 及 字节序转换 socket简介Socket为什么需要Socket?socket类型Socket通信模型 字节序主机字节序到网络字节序网络字节序到主机字节序IP地址转换 socket简介 1、1982 - Berkeley Software Distributions 操作系统引入了socket作为本地进程之间通信的接口 2、1…...

Java之~ Aop自定义注解日志
大纲步骤: 一,创建需要记录的日志表,创建基础方法。(省略) 二,在需要加记录日志的方法上加Aop注解1,创建一个注解类,Aop中定义一个注解import java.lang.annotation.*; /*** http 请…...
编译原理个人作业--第四章
构造FIRST和FOLLOW的大白话网站 第四章 1 考虑文法 G 1 G_1 G1: S → a ∣ ∧ ∣ ( T ) T → T , S ∣ S S \rightarrow a|\land|(T) \\ T\rightarrow T,S|S S→a∣∧∣(T)T→T,S∣S 先复习左递归如何消除 原书p69页 类似于 P → P a ∣ b P\rightarrow Pa|b P→Pa∣b的…...
学习笔记:数据库简介
数据库是一系列可以方便的访问和修改的数据的集合。 所有数据库管理系统的主要工作都是可靠的存储数据并使其对用户可用。 目前最常见的数据库模型主要是两种,即关系型数据库和非关系型数据库。 一、按数据的组织方式 数据从组织的角度上,主要分为结…...

day18_集合
今日内容 零、 复习昨日 一、集合框架体系 二、Collection 三、泛型 四、迭代 五、List 六、ArrayList 七、LinkedList 零、 复习昨日 晨考 一、集合框架体系 数组: 是一个容器,用来存放数据的 定长只能存储同一种数据类型的数据int[] 可以存储int值,Student[] 可以存储引用类型…...
Go面试必会基础题
文章目录 1.下面代码有什么错误?2.下面代码有什么问题?3.下面代码输出什么?4.下面这段代码输出什么? 1.下面代码有什么错误? func main() {one : 0one : 1 }参考答案及解析:变量重复声明。不能在单独的声…...

发送封包协议实现XXZ批量秒分解装备
通过发送封包,我们可以让一些反复的枯燥的行为变的简单,高效。 比如XXZ的萃取装备,我们可以一瞬间萃取大量的装备,而省去读条的过程。 我们来萃取一下看看效果 手动萃取是有读条的,那么如果很多装备的话,…...

Spring学习——Nginx
Nginx概述 Nginx介绍 Nginx是一款轻量级的web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx的网…...

记录 vue-cli 安装过程
1. VueCli CLI 是 Commond-Line Interface 的缩写 如果开发大型项目,肯定需要考虑代码目录结构、项目结构和部署、热加载、代码单元测试等事情,那么你必然需要使用 VueCLI,使用 VueCLI 可以快速搭建 vue 开发环境以及对应的 webpack 配置。 …...

含氢微网优化调度模型matlab
目录 1 主要内容 模型示意图 目标函数 2 部分程序 3 程序结果 4 下载链接 1 主要内容 最近咨询含氢微网优化调度模型的同学较多,本次就分享一个高质量的源码资源。该程序方法复现《Simulation of design and operation of hydrogen energy utilization syste…...

【springcloud开发教程】路由网关——zuul
官方资料:https://github.com/Netflix/zuul/ 什么是Zuul? Zuul包含了两个主要的功能:路由和过滤 路由功能将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础,而过滤器功能则负责对请求的处理过程进行干预&#…...

DF竞赛平台携手嬴彻科技与清华大学智能产业研究院,助力自动驾驶挑战赛圆满落幕!
由DataFountain竞赛平台(简称DF平台)提供办赛支持的「首届“嬴彻-清华AIR杯”自动驾驶挑战赛:决策规划算法」已圆满落幕。作为一场前沿性自动驾驶类比赛,本次大赛立足“高速道路”和“城市道路”两大真实场景,选择“半…...

234:vue+openlayers 加载本地shp数据,在map上显示图形
第234个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers中利用shapefile读取本地的shp数据,并在地图上显示图形。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果 文章目录 示例效果安装引用配置方式示例源代码(共143行)相关API参考:专栏…...

网络模型-网络体系结构(OSI、TCP/IP)
网络模型(网络体系结构) 网络模型网络的体系结构OSI模型TCP/IP模型OSI和TCP/IP模型对应关系图 常见网络协议 网络模型 网络的体系结构 1、网络采用分而治之的方法设计,将网络的功能划分为不同的模块,以分层的形式有机组合在一起…...

园区智慧导览地图软件,智慧工厂导航定位怎么解决方案的
智慧工厂导航定位怎么解决方案的地图新基建是行业的核心数字基础需求之一,行业内中已构建了较为完整的城市级地理信息系统。园区管理涉及众多方面,因此园区的智慧信息化建设至关重要,需求越来越广泛。在智慧园区中,基于园区的电子…...

Redis高可用之3种集群方案对比
Redis集群方案使用建议: Redis cluster:除非是1000个节点以上的超大规模集群,优先考虑使用Redis clustercodis:旧项目如果仍在使用codis,可继续使用,但也推荐迁移到Redis clustertwemproxy:不建…...
java 线程唤醒于阻塞的常用方法
1.分类描述 1.sleep() 休眠2.suspend() 暂停和 resume() 继续3.yield() 让步 就是我放弃本次执行,但继续排队,下一次有机会在执行。 4.wait() 和 notify() notifyAll() 注:这两个方法,属于Object类,而不属于Thread…...

面包多面包多面包多面包多面包多面包多
1.背景 1.摘要 本文是针对智慧政务中的文本数据挖掘应用的研究。通过建立基于三层网络结构的fastText文本分类模型,聚类量化模型,熵权评估模型解决了群众留言分类,热点问题挖掘,答复意见评价等问题。 针对群众留言分类问题&#…...

windows下Tomcat安装
目录 1.安装java环境 2.配置Tomcat环境变量 3.安装服务 4.启动前修改配置文件 (1)设置tomcat端口 (2)设置临时日志等文件夹的位置 5.放入应用 6.启动Tomcat服务 1.安装java环境 安装tomcat版本对应的JDK 比如:…...

华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...

DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...

用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...