JavaScript代码优雅,简洁的编写技巧总结

1. 强类型检查

用===代替 ==

// 如果处理不当,它会极大地影响程序逻辑。这就像,你想向左走,但由于某种原因,你向右走
0 == false // true
0 === false // false
2 == "2" // true
2 === "2" // false
// 例子
const value = "500";
if (value === 500) {
console.log(value);
// 条件不成立,不会进入
}

if (value === "500") {
console.log(value);
// 条件成立,会进入
}

2.变量

用知名其意的方式为变量命名,通过这种方式,当一个人看到它们时,易于搜索和理解。
不好的方式:

let daysSLV = 10;
let y = new Date().getFullYear();

let ok;
if (user.age > 30) {
ok = true;
}

好的方式:
const MAX_AGE = 30;
let daysSinceLastVisit = 10;
let currentYear = new Date().getFullYear();

...

const isUserOlderThanAllowed = user.age > MAX_AGE;

不要在变量名中添加额外的不需要的单词。

不好的方式:
let nameValue;
let theProduct;

好的方式:
let name;
let product;

不要简写变量上下文。
不好的方式:
const users = ["John", "Marco", "Peter"];
users.forEach(u => {
doSomething();
doSomethingElse();
// ...
// ...
// ...
// ...
// 当上面代码很多的时候 ,这 `u` 是什么鬼
register(u);
});

好的方式:
const users = ["John", "Marco", "Peter"];
users.forEach(user => {
doSomething();
doSomethingElse();
// ...
// ...
// ...
// ...
register(user);
});

不要添加不必要的上下文。
不好的方式:
const user = {
userName: "John",
userSurname: "Doe",
userAge: "28"
};

...

user.userName;

好的方式:
const user = {
name: "John",
surname: "Doe",
age: "28"
};

...

user.name;

3. 函数

使用长而具有描述性的名称。 考虑到函数表示某种行为,函数名称应该是动词或短​​语,用以说明其背后的意图以及参数的意图。 函数的名字应该说明他们做了什么。
不好的方式:

function notif(user) {
// implementation
}

好的方式:
function notifyUser(emailAddress) {
// implementation
}

避免使用大量参数。 理想情况下,函数应该指定两个或更少的参数。 参数越少,测试函数就越容易,参数多的情况可以使用对象。
不好的方式:

function getUsers(fields, fromDate, toDate) {
// implementation
}

好的方式:
function getUsers({ fields, fromDate, toDate }) {
// implementation
}

getUsers({
fields: ['name', 'surname', 'email'],
fromDate: '2019-01-01',
toDate: '2019-01-18'
});

使用默认参数替代 || 操作

不好的方式:
function createShape(type) {
const shapeType = type || "cube";
// ...
}

好的方式:
function createShape(type = "cube") {
// ...
}

一个函数应该只做一件事,不要在一个函数中执行多个操作。

不好的方式:
function notifyUsers(users) {
users.forEach(user => {
const userRecord = database.lookup(user);
if (userRecord.isVerified()) {
notify(user);
}
});
}

好的方式:
function notifyVerifiedUsers(users) {
users.filter(isUserVerified).forEach(notify);
}

function isUserVerified(user) {
const userRecord = database.lookup(user);
return userRecord.isVerified();
}

使用Object.assign设置对象默认值。

不好的方式:
const shapeConfig = {
type: "cube",
width: 200,
height: null
};

function createShape(config) {
config.type = config.type || "cube";
config.width = config.width || 250;
config.height = config.height|| 250;
}

createShape(shapeConfig);

好的方式:
const shapeConfig = {
type: "cube",
width: 200
// Exclude the 'height' key
};

function createShape(config) {
config = Object.assign(
{
type: "cube",
width: 250,
height: 250
},
config
);

...
}

createShape(shapeConfig);

不要使用标志作为参数,因为它们告诉函数做的比它应该做的多。

不好的方式:
function createFile(name, isPublic) {
if (isPublic) {
fs.create(`./public/${name}`);
} else {
fs.create(name);
}
}

好的方式:
function createFile(name) {
fs.create(name);
}

function createPublicFile(name) {
createFile(`./public/${name}`);
}

不要污染全局变量。 如果需要扩展现有对象,请使用ES类和继承,而不是在原生对象的原型链上创建函数。

不好的方式:
Array.prototype.myFunc = function myFunc() {
// implementation
};

好的方式:
class SuperArray extends Array {
myFunc() {
// implementation
}
}

4. 条件

避免使用反面条件。

不好的方式:
function isUserNotBlocked(user) {
// implementation
}

if (!isUserNotBlocked(user)) {
// implementation
}

好的方式:
function isUserBlocked(user) {
// implementation
}

if (isUserBlocked(user)) {
// implementation
}

使用条件简写。这可能微不足道,但值得一提。仅对布尔值使用此方法,并且如果你确信该值不会是undefined 或null的,则使用此方法。

不好的方式:
if (isValid === true) {
// do something...
}

if (isValid === false) {
// do something...
}

好的方式:
if (isValid) {
// do something...
}

if (!isValid) {
// do something...
}

尽可能避免条件句,而是使用多态性和继承。

不好的方式:
class Car {
// ...
getMaximumSpeed() {
switch (this.type) {
case "Ford":
return this.someFactor() + this.anotherFactor();
case "Mazda":
return this.someFactor();
case "McLaren":
return this.someFactor() - this.anotherFactor();
}
}
}

好的方式:
class Car {
// ...
}

class Ford extends Car {
// ...
getMaximumSpeed() {
return this.someFactor() + this.anotherFactor();
}
}

class Mazda extends Car {
// ...
getMaximumSpeed() {
return this.someFactor();
}
}

class McLaren extends Car {
// ...
getMaximumSpeed() {
return this.someFactor() - this.anotherFactor();
}
}

5. 类

class 是JavaScript中新的语法糖。一切工作就像以前的原型,只是它现在看起来不同,你应该更喜欢他们比ES5普通功能。

不好的方式:
const Person = function(name) {
if (!(this instanceof Person)) {
throw new Error("Instantiate Person with `new` keyword");
}

this.name = name;
};

Person.prototype.sayHello = function sayHello() { /**/ };

const Student = function(name, school) {
if (!(this instanceof Student)) {
throw new Error("Instantiate Student with `new` keyword");
}

Person.call(this, name);
this.school = school;
};

Student.prototype = Object.create(Person.prototype);
Student.prototype.constructor = Student;
Student.prototype.printSchoolName = function printSchoolName() { /**/ };

好的方式:
class Person {
constructor(name) {
this.name = name;
}

sayHello() {
/* ... */
}
}

class Student extends Person {
constructor(name, school) {
super(name);
this.school = school;
}

printSchoolName() {
/* ... */
}
}

使用链接。许多库(如jQuery和Lodash)都使用这种模式。在类中,只需在每个函数的末尾返回this就可以将更多的该类方法链接到它上。

不好的方式:
class Person {
constructor(name) {
this.name = name;
}

setSurname(surname) {
this.surname = surname;
}

setAge(age) {
this.age = age;
}

save() {
console.log(this.name, this.surname, this.age);
}
}

const person = new Person("John");
person.setSurname("Doe");
person.setAge(29);
person.save();

好的方式:
class Person {
constructor(name) {
this.name = name;
}

setSurname(surname) {
this.surname = surname;
// Return this for chaining
return this;
}

setAge(age) {
this.age = age;
// Return this for chaining
return this;
}

save() {
console.log(this.name, this.surname, this.age);
// Return this for chaining
return this;
}
}

const person = new Person("John")
.setSurname("Doe")
.setAge(29)
.save();

总结

这只是改进代码的一小部分。一般生活入,这里所说的原则是人们通常不遵守的原则。他们尝试着去做,但出于各种原因,就没有坚持下去。也许在项目开始时,代码是简洁的,但是当要在截止日期前完成时,这些原则常常被忽略,并被转移到“TODO”或“REFACTOR”部分。在这一点上,你的客户更希望您在最后期限之前完成任务,而不是编写简洁的代码。

更多关于如何优雅,简洁的编写JavaScript代码技巧请查看下面的相关文章

(0)

相关推荐

  • JavaScrip将数组转为对象与JSON对象字符串转数组方法详解

    JavaScrip将数组转为对象(JS数组转对象工作经常用) 我想获取一个元素数组,并将它们转换为一个对象.数组中的元素需要是对象的键,带有一些默认的空字符串,作为以后要更改的值. ['name','age','city', 'town', 'country'] { name: "", age: "", city: "", town: "", country: "" } 最后我发现我们可以使用数组的redu

  • Javascript Object对象类型使用详解

    目录 1. 生成方法 2. 操作属性 2.1 读取 2.2 赋值 2.3 删除 2.4 遍历 2.5 判断属性是否存在 3. with 语句 总结 1. 生成方法 对象是javaScript中的一种数据类型,它是key-value的合集,是无序的 const obj = { name: 'ian',age: 21}; //key使用变量 const gender = 'gender'; const obj = { [gender]: 'male'}; 对象的key必须符合标识符的规则,写的时候k

  • JavaScript日拱算法题解滑动窗口的最大值示例

    目录 题目: 题解: 第一反应 JavaScript 实现 第二反应 JS 实现 小结: 题目: 给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值. 示例: 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3 输出: [3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值 --------------- ----- [1 3 -1] -3 5 3 6 7 3 1 [3 -1 -3] 5 3 6 7 3 1 3 [-1 -3 5] 3 6

  • js中对象深拷贝方法总结

    快速克隆(存在数据丢失问题) – JSON.parse/stringify 如果不在对象中使用Date.functions.undefined.Infinity.RegExps.Maps.Sets.blob.FileLists.ImageDatas.或其他复杂类型,则深入克隆对象库可以使用非常简单的一行代码. 简单的来说有以下问题: 会忽略 undefined 会忽略 symbol 不能序列化函数 不能解决循环引用的对象 JSON.parse(JSON.stringify(object)) co

  • 纯 JS 实现的轻量化图片编辑器实例详解

    目录 介绍 一款纯 JS 实现的轻量化图片编辑器 Optimizer 框架特点 Optimizer 框架使用 启动 场景管理器 (Scene) 页面事件Event 鼠标事件 键盘事件 注册组件 Component 使用组件 总结 介绍 因为一些特点的工作场景, 写文章的需要每次处理一些图片, 在上面加说明文字, 或者加一些图形 刚开始使用 PPT 来处理, 一张张复制过去, 做一些边框阴影处理, 再加一些图形, 然后再导出来复制到需要的地方, 而且导出后的图片之后可能不会再使用了还要清理. 图片

  • JavaScript 弱引用强引用底层示例详解

    目录 正文 1. 弱引用 2. 强引用 3. JavaScript 的垃圾收集 3.1 可达性 4. Set VS WeakSet 5. Map VS WeakMap 6. WeakMap 的应用 6.1 缓存 6.2 额外的数据存储 7. 小结 正文 内存和性能管理是软件开发的重要方面,也是每个软件开发人员都应该注意的方面.虽然弱引用很有用,但在 JavaScript 中并不经常使用.在 ES6 版本中,JavaScript 引入了 WeakSet 和 WeakMap. 1. 弱引用 与强引用

  • JavaScript中原始值和引用值深入讲解

    目录 值和引用相关内容 1. 简单值(原始值) 2. 复杂值(引用值) 3. 访问方式 4. 比较方式 5. 动态属性 6. 变量赋值 灵魂拷问 总结 值和引用相关内容 在 JavaScript 中,数据类型整体上来讲可以分为两大类:基本类型和引用数据类型 基本数据类型,一共有 6 种: string,symbol,number,boolean,undefined,null 其中 symbol 类型是在 ES6 里面新添加的基本数据类型. 引用数据类型,就只有 1 种: object 基本数据类

  • 让JavaScript代码更加精简的方法技巧

    目录 前言: 对象解构示例 {} 解构空对象 嵌套对象解构 前言: 使用 JavaScript 对象解构来节省代码,JavaScript 对象解构赋值在项目开发中是一个常用的技能. 先来看一个 article 对象,有两个属性 title 和 description. const article = { title: "JavaScript对象解构赋值", description: "解构是一个概念,分解其中一种数据类型并将其单独的属性分配给变量", }; 在 ES

  • JavaScript代码优雅,简洁的编写技巧总结

    1. 强类型检查 用===代替 == // 如果处理不当,它会极大地影响程序逻辑.这就像,你想向左走,但由于某种原因,你向右走 0 == false // true 0 === false // false 2 == "2" // true 2 === "2" // false // 例子 const value = "500"; if (value === 500) { console.log(value); // 条件不成立,不会进入 } i

  • 2019 年编写现代 JavaScript 代码的5个小技巧(小结)

    内容基本是今年从其他大神的文章学习到的东西.分享给大家: 1 Array.includes 与条件判断 一般我们判断或用 || // condition function test(fruit) { if (fruit == "apple" || fruit == "strawberry") { console.log("red"); } } 如果我们有更多水果 function test(fruit) { const redFruits = [

  • 如何利用Promises编写更优雅的JavaScript代码

    你可能已经无意中听说过 Promises,很多人都在讨论它,使用它,但你不知道为什么它们如此特别.难道你不能使用回调么?有什么了特别的?在本文中,我们一起来看看 Promises 是什么以及如何使用它们写出更优雅的 JavaScript 代码. Promises 易于阅读 比如说我们想从 HipsterJesus 的API中抓取一些数据并将这些数据添加到我们的页面中.这些 API 的响应数据形式如下: { "text": "<p>Lorem ipsum...<

  • 通过实践编写优雅的JavaScript代码

    有没有似曾相识 如果你对于代码,除了关注是否能准确的执行业务逻辑,还关心代码本身是怎么写的,是否易读,那么你应该会关注如何写出干净优雅的代码.作为专业的工程师,除了保证自己的代码没有bug,能正确的完成业务逻辑,还应该保证几个月后的自己,或者其他工程师,也能够维护自己的代码.你写的每一段代码,通常情况下,都不会是 一次性 工作,通常伴随着后续的不断迭代.如果代码不够优雅,那么将来维护这段代码的人(甚至你自己),都将感到非常痛苦.祈祷吧,将来面对这些糟糕代码的人,不是你自己,而是别人. OK,我们

  • JavaScript深入V8引擎以及编写优化代码的5个技巧

    概述 JavaScript引擎是执行 JavaScript 代码的程序或解释器.JavaScript引擎可以实现为标准解释器,或者以某种形式将JavaScript编译为字节码的即时编译器. 以为实现JavaScript引擎的流行项目的列表: V8 - 开源,由 Google 开发,用 C ++ 编写 Rhino - 由 Mozilla 基金会管理,开源,完全用 Java 开发 SpiderMonkey - 是第一个支持 Netscape Navigator 的 JavaScript 引擎,目前正

  • 【经验总结】编写JavaScript代码时应遵循的14条规律

    本文讲述了编写JavaScript代码时应遵循的14条规律.分享给大家供大家参考,具体如下: 1. 总是使用 'var' 在javascript中,变量不是全局范围的就是函数范围的,使用"var"关键词将是保持变量简洁明了的关键.当声明一个或者是全局或者是函数级(function-level)的变量,需总是前置"var"关键词,下面的例子将强调不这样做潜在的问题. 不使用 Var 造成的问题 var i=0; // This is good - creates a

  • javascript简写常用的12个技巧(可以大大减少你的js代码量)

    前言 本文主要给大家分享了javascript简写常用的12个技巧,无论你是初学者还是资深人士,都值得一读!下面话不多说了,来一起看看详细的介绍: 1. 空(null, undefined)验证 当我们创建了一个新的变量,我们通常会去验证该变量的值是否为空(null)或者未定义(undefined).这对于JavaScript编程来说,是一个经常要考虑到的验证. 如果直接写,像下面这样: if (variable1 !== null || variable1 !== undefined || v

  • 编写更好的JavaScript条件式和匹配条件的技巧(小结)

    介绍 如果你像我一样乐于见到整洁的代码,那么你会尽可能地减少代码中的条件语句.通常情况下,面向对象编程让我们得以避免条件式,并代之以继承和多态.我认为我们应当尽可能地遵循这些原则. 正如我在另一篇文章 JavaScript 整洁代码的最佳实践里提到的,你写的代码不单单是给机器看的,还是给"未来的自己"以及"其他人"看的. 从另一方面来说,由于各式各样的原因,可能我们的代码最终还是会有条件式.也许是修复 bug 的时间很紧,也许是不使用条件语句会对我们的代码库造成大的

  • 一些让Python代码简洁的实用技巧总结

    目录 前言 1. 使用Lambda来修改Pandas数据框中的值 2. 使用f-string来连接字符串 3. 用Zip()函数对多个列表进行迭代 4. 使用列表理解法 5. 对文件对象使用with语句 6. 停止使用方括号来获取字典项, 利用.get()代替 7. 多重赋值 总结 前言 众所周知,编写Python代码在开始时十分容易,但随着你在工具包中添加更多的库,你的脚本可能会有不必要的代码行,变得冗长而混乱.可能短期内能够应付工作,但长期来看,麻烦不小. 在这篇文章中,我将与你分享7个技巧

随机推荐