Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >[译] 如何写出漂亮的 JavaScript 代码

[译] 如何写出漂亮的 JavaScript 代码

作者头像
小生方勤
发布于 2019-07-01 06:29:59
发布于 2019-07-01 06:29:59
61700
代码可运行
举报
文章被收录于专栏:前端词典前端词典
运行总次数:0
代码可运行

原文:github.com/ryanmcdermott/clean-code-javascript 说明:本文翻译自 github 上的一个项目,只取部分精华。

如何提高代码的可读性、复用性、扩展性。我们将从以下四个方面讨论:

  1. 变量
  2. 函数
  3. 异步

一、变量

用有意义且常用的单词命名

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Bad:
const yyyymmdstr = moment().format('YYYY/MM/DD');
// Good:
const currentDate = moment().format('YYYY/MM/DD');

保持统一

对同一类型的变量使用相同的命名保持统一:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Bad:
getUserInfo();
getClientData();
getCustomerRecord();
// Good:
getUser()

每个常量(全大写)都该命名

可以用 ESLint 检测代码中未命名的常量。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Bad:
// 其他人知道 86400000 的意思吗?
setTimeout( blastOff, 86400000 );
// Good:
const MILLISECOND_IN_A_DAY = 86400000;
setTimeout( blastOff, MILLISECOND_IN_A_DAY );

避免无意义的命名

既然创建了一个 car 对象,就没有必要把它的颜色命名为 carColor。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Bad:
const car = {
    carMake: 'Honda',
    carModel: 'Accord',
    carColor: 'Blue'
};
function paintCar( car ) {
    car.carColor = 'Red';
}
// Good:
const car = {
    make: 'Honda',
    model: 'Accord',
    color: 'Blue'
};
function paintCar( car ) {
    car.color = 'Red';
}

传参使用默认值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Bad:
function createMicrobrewery( name ) {
 const breweryName = name || 'Hipster Brew Co.';
 // ...
}
// Good:
function createMicrobrewery( name = 'Hipster Brew Co.' ) {
 // ...
}

二、函数

函数参数( 最好 2 个或更少 )

如果参数超过两个,建议使用 ES6 的解构语法,不用考虑参数的顺序。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Bad:
function createMenu( title, body, buttonText, cancellable ) {
 // ...
}
// Good:
function createMenu( { title, body, buttonText, cancellable } ) {
 // ...
}
createMenu({
    title: 'Foo',
    body: 'Bar',
    buttonText: 'Baz',
    cancellable: true
});

一个方法只做一件事情

这是一条在软件工程领域流传久远的规则。严格遵守这条规则会让你的代码可读性更好,也更容易重构。如果违反这个规则,那么代码会很难被测试或者重用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Bad:
function emailClients( clients ) {
    clients.forEach( client => {
 const clientRecord = database.lookup( client );
 if ( clientRecord.isActive() ) {
            email( client );
 }
 });
}
// Good:
function emailActiveClients( clients ) {
    clients
 .filter( isActiveClient )
 .forEach( email );
}
function isActiveClient( client ) {
 const clientRecord = database.lookup( client ); 
 return clientRecord.isActive();
}

函数名上体现它的作用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Bad:
function addToDate( date, month ) {
 // ...
}
const date = new Date();
// 很难知道是把什么加到日期中
addToDate( date, 1 );
// Good:
function addMonthToDate( month, date ) {
 // ...
}
const date = new Date();
addMonthToDate( 1, date );

删除重复代码,合并相似函数

很多时候虽然是同一个功能,但由于一两个不同点,让你不得不写两个几乎相同的函数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Bad:
function showDeveloperList(developers) {
  developers.forEach((developer) => {
 const expectedSalary = developer.calculateExpectedSalary();
 const experience = developer.getExperience();
 const githubLink = developer.getGithubLink();
 const data = {
      expectedSalary,
      experience,
      githubLink
 };
    render(data);
 });
}
function showManagerList(managers) {
  managers.forEach((manager) => {
 const expectedSalary = manager.calculateExpectedSalary();
 const experience = manager.getExperience();
 const portfolio = manager.getMBAProjects();
 const data = {
      expectedSalary,
      experience,
      portfolio
 };
    render(data);
 });
}
// Good:
function showEmployeeList(employees) {
  employees.forEach(employee => {
 const expectedSalary = employee.calculateExpectedSalary();
 const experience = employee.getExperience();
 const data = {
      expectedSalary,
      experience,
 };
 switch(employee.type) {
 case 'develop':
        data.githubLink = employee.getGithubLink();
 break
 case 'manager':
        data.portfolio = employee.getMBAProjects();
 break
 }
    render(data);
 })
}

使用 Object.assign 设置默认属性

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Bad:
const menuConfig = {
  title: null,
  body: 'Bar',
  buttonText: null,
  cancellable: true
};
function createMenu(config) {
  config.title = config.title || 'Foo';
  config.body = config.body || 'Bar';
  config.buttonText = config.buttonText || 'Baz';
  config.cancellable = config.cancellable !== undefined ? config.cancellable : true;
}
createMenu(menuConfig);
// Good:
const menuConfig = {
  title: 'Order',
 // 不包含 body
  buttonText: 'Send',
  cancellable: true
};
function createMenu(config) {
  config = Object.assign({
    title: 'Foo',
    body: 'Bar',
    buttonText: 'Baz',
    cancellable: true
 }, config);
 // config : {title: "Order", body: "Bar", buttonText: "Send", cancellable: true}
 // ...
}
createMenu(menuConfig);

尽量不要写全局方法

在 JavaScript 中,永远不要污染全局,会在生产环境中产生难以预料的 bug。举个例子,比如你在 Array.prototype 上新增一个 diff 方法来判断两个数组的不同。而你同事也打算做类似的事情,不过他的 diff 方法是用来判断两个数组首位元素的不同。很明显你们方法会产生冲突,遇到这类问题我们可以用 ES2015/ES6 的语法来对 Array 进行扩展。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Bad:
Array.prototype.diff = function diff(comparisonArray) {
 const hash = new Set(comparisonArray);
 return this.filter(elem => !hash.has(elem));
};
// Good:
class SuperArray extends Array {
  diff(comparisonArray) {
 const hash = new Set(comparisonArray);
 return this.filter(elem => !hash.has(elem)); 
 }
}

尽量别用“非”条件句

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Bad:
function isDOMNodeNotPresent(node) {
 // ...
}
if (!isDOMNodeNotPresent(node)) {
 // ...
}
// Good:
function isDOMNodePresent(node) {
 // ...
}
if (isDOMNodePresent(node)) {
 // ...
}

不要过度优化

现代浏览器已经在底层做了很多优化,过去的很多优化方案都是无效的,会浪费你的时间。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Bad:
// 现代浏览器已对此( 缓存 list.length )做了优化。
for (let i = 0, len = list.length; i < len; i++) {
 // ...
}
// Good:
for (let i = 0; i < list.length; i++) {
 // ...
}

删除弃用代码

这里没有实例代码,删除就对了

三、类

使用 ES6 的 class

在 ES6 之前,没有类的语法,只能用构造函数的方式模拟类,可读性非常差。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Good:
// 动物
class Animal {
  constructor(age) {
 this.age = age
 };
  move() {};
}
// 哺乳动物
class Mammal extends Animal{
  constructor(age, furColor) {
 super(age);
 this.furColor = furColor;
 };
  liveBirth() {};
}
// 人类
class Human extends Mammal{
  constructor(age, furColor, languageSpoken) {
 super(age, furColor);
 this.languageSpoken = languageSpoken;
 };
  speak() {};
}

使用链式调用

这种模式相当有用,可以在很多库中都有使用。它让你的代码简洁优雅。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Car {
  constructor(make, model, color) {
 this.make = make;
 this.model = model;
 this.color = color;
 }
  setMake(make) {
 this.make = make;
 }
  setModel(model) {
 this.model = model;
 }
  setColor(color) {
 this.color = color;
 }
  save() {
    console.log(this.make, this.model, this.color);
 }
}
// Bad:
const car = new Car('Ford','F-150','red');
car.setColor('pink');
car.save();
// Good:  方法中要 return this 
const car = new Car('Ford','F-150','red')
 .setColor('pink')
 .save();

四、异步

使用 promise 或者 Async/Await 代替回调

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Bad:
get('https://en.wikipedia.org/wiki/Robert_Cecil_Martin', (requestErr, response) => {
 if (requestErr) {
    console.error(requestErr);
 } else {
    writeFile('article.html', response.body, (writeErr) => {
 if (writeErr) {
        console.error(writeErr);
 } else {
        console.log('File written');
 }
 });
 }
});
// Good:
get('https://en.wikipedia.org/wiki/Robert_Cecil_Martin')
 .then((response) => {
 return writeFile('article.html', response);
 })
 .then(() => {
    console.log('File written');
 })
 .catch((err) => {
    console.error(err);
 });
// perfect:
async function getCleanCodeArticle() {
 try {
 const response = await get('https://en.wikipedia.org/wiki/Robert_Cecil_Martin');
 await writeFile('article.html', response);
    console.log('File written');
 } catch(err) {
    console.error(err);
 }
}

Vue 相关文章输出计划

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-06-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小生方勤 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
如何编写漂亮的 JavaScript 代码
这是一条编程领域流传久远的规则。严格遵守这条规则会让你的代码可读性更好,也更容易重构。如果违反这个原则,那么代码会很难被测试或者重用。
小鑫
2022/02/23
8660
简洁的javascript编码(一)--变量、函数
本文作者:IMWeb jaychen 原文出处:IMWeb社区 未经同意,禁止转载 一、变量 使用语义化的变量名称 Bad const yyyymmdstr = moment().
IMWeb前端团队
2018/01/08
2.2K0
简洁的javascript编码(一)--变量、函数
如何写出优雅的 JS 代码,变量和函数的正确写法
在开发中,变量名,函数名一般要做到清晰明了,尽量做到看名字就能让人知道你的意图,所以变量和函数命名是挺重要,今天来看看如果较优雅的方式给变量和函数命名。
前端小智@大迁世界
2020/05/18
3.9K0
深度讲解JavaScript 开发规范 ---(变量,函数(规范较多))
本文从变量、函数、对象、数据结构、类、测试、并发、错误处理、格式化等方面进行介绍。
zhouzhouya
2023/11/02
2940
一份开源的编码规范:代码整洁的 JavaScript
作者根据 Robert C. Martin 《代码整洁之道》总结了适用于 JavaScript 的软件工程原则《Clean Code JavaScript》。
落落落洛克
2021/03/08
8830
代码整洁的 JavaScript
将源自 Robert C. Martin 的 Clean Code 的软件工程原则适配到 JavaScript 。 这不是一个代码风格指南, 它是一个使用 JavaScript 来生产 可读的, 可重用的, 以及可重构的软件的指南。
beginor
2020/08/07
1K0
代码整洁的 JavaScript
JavaScript 风格指南 [每日前端夜话(0x1C)]
原文链接:https://github.com/ryanmcdermott/clean-code-javascript
疯狂的技术宅
2019/03/27
8790
JavaScript 风格指南 [每日前端夜话(0x1C)]
什么代码会遭人耻笑,什么妹子会受人喜欢?从妹子角度戏说代码优劣。
在日常生活中,丑姑娘和好姑娘一眼就能识别;在代码中,好代码与坏代码却不容易觉察,这里面有标准,但每个程序员都觉得自己创造的代码好。了解这些标准,可以有效避免写出坏代码。
LIYI
2019/09/27
4140
什么代码会遭人耻笑,什么妹子会受人喜欢?从妹子角度戏说代码优劣。
P代码整洁之道
使用有意义且可发音的变量名 Bad: $ymdstr = $moment->format('y-m-d'); Good: $currentDate = $moment->format('y-m-d'); 对同一类型的变量使用相同的词汇表 Bad: getUserInfo(); getUserData(); getUserRecord(); getUserProfile(); Good: getUser(); 使用可搜索的名称(第一部分) Bad: $result = $serializer->ser
用户8568307
2022/03/14
2890
揭秘 JavaScript 代码整洁技巧,让你的项目更出众
代码质量与整洁度成正比。有的团队在赶工期的时候,不注重代码的整洁,代码写的越来越糟糕,项目越来越混乱,生产力也跟着下降,那就必须找更多人来提高生产力,开发成本越来越高。
winty
2024/03/18
1430
揭秘 JavaScript 代码整洁技巧,让你的项目更出众
JavaScript 开发规范---让你的代码像诗一样优雅(二)
JS 没有接口或类型,因此实现这一模式是很困难的,因为我们并没有类似 public 和 private 的关键词。
zhouzhouya
2023/11/01
4160
3 个可能有用的奇怪 JavaScript 类
英文 | https://javascript.plainenglish.io/3-weird-javascript-class-tricks-that-could-be-useful-c5a78144d574
winty
2022/02/18
3650
python版代码整洁之道
原文:https://github.com/zedr/clean-code-python
kbsc13
2020/02/19
1.2K0
《重构-代码整洁之道TypeScript版》第一天
看到这个标题你的脑海中一定会浮现出两本书,一本就是,《重构--改善既有代码设计》 和 《代码整洁之道》 。这确实是两本非常伟大的图书,但是很遗憾里面提供的 code 都是 Java 的版本。《重构--改善既有代码设计》 的第2版提供了 JavaScript 的版本,已经非常方便我们前端同学阅读了,但是在 TypeScrip 如此火热的今天,缺了 TS 的版本,始终觉得是些遗憾,所以老袁打算每天拿出一些时间将一些非常经典的案例,结合老袁十年的经验总结到一块使用 TS 重写,希望能陪伴各位的技术成长之路,我会从大致如下方向跟各位共同分享:
疯狂的技术宅
2020/08/04
1.1K0
JavaScript 变量命名规范总结
看完以上几个示例,我们就知道自己在变量命名这么一件简单的事情上达到了什么层次。当然,其实这个”小事“并不简单,且很重要。本文从「符合命名规范」和「有意义的命名」两个维度,提出了一些实操建议,欢迎拍砖。
coder_koala
2021/07/08
1.1K0
【Web前端】JavaScript 对象基础
JavaScript 是一种以对象为基础的编程语言,操作数据时,实际都是在处理对象。可以使用简单的数据类型(如字符串、数字和布尔值)来实现一些功能,但深入了解 JavaScript 对象的运作,将使你能够编写更强大和灵活的代码。
一条晒干的咸鱼
2024/11/19
750
【Web前端】JavaScript 对象基础
详解JavaScript的Object对象
Object 是 JavaScript 的一种 数据类型 ,用于存储各种键值集合和更复杂的实体,几乎所有对象都是 Object 类型的实例,它们都会从 Object.prototype 继承属性和方法,虽然大部分属性都会被覆盖(shadowed)或者说被重写了(overridden)。
Learn-anything.cn
2021/12/22
6660
如何写出干净的 JavaScript 代码
一段干净的代码,你在阅读、重用和重构的时候都能非常轻松。编写干净的代码非常重要,因为在我们日常的工作中,你不是仅仅是在为自己写代码。实际上,你还需要考虑一群需要理解、编辑和构建你的代码的同事。
ConardLi
2021/09/08
1.1K0
如何写出干净的 JavaScript 代码
JavaScript 编程规范(二)
1. 总是使用 const 或 let 来声明变量。 不这样做会导致产生全局变量。 我们希望避免污染全局命名空间。
桃翁
2019/03/18
1.6K0
最新前端Vue代码风格指南大全
参照项目命名规则,有复数结构时,要采用复数命名法。例:docs、assets、components、directives、mixins、utils、views。
江一铭
2022/06/16
3.8K0
最新前端Vue代码风格指南大全
推荐阅读
相关推荐
如何编写漂亮的 JavaScript 代码
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验