JavaScript
JavaScript
引用
所有的赋值都使用 const,如果一定要对参数重新赋值要使用 let 而不是 var。
对象
使用字面值创建对象而不是 new,例如:
const obj = {};
使用计算属性名创建动态属性名的对象而不是在对象定义外再创建:
const obj = {
[getKey()]: true,
};
对象方法使用简写形式。
可以简写的属性名要简写,简写的属性要放前面。
属性名不必要加引号就不加。
不要直接调用 Object.prototype
上的方法,有的方法可能会被屏蔽,可以这样:
Object.prototype.hasOwnProperty.call(obj, key);
对象浅拷贝应该使用扩展运算符。
数组
用字面量创建数组。
用 push 方法向数组中添加值。
用扩展运算符做浅拷贝。
用扩展运算符将可迭代对象转换成数组,用 Array.from
将一个类数组对象转成一个数组。
用 Array.from
做 map 遍历,对比扩展运算符可以避免创建一个临时数组。
如果一个数组有很多行,在数组的前后中括号进行换行。
除了 forEach 方法,其他方法如 map、reduce 等方法中要有 return。
解构
用对象的解构赋值来获取和使用对象某个或多个属性值。
多个返回值用对象的解构而不是数组解构。
字符串
字符串应该使用单引号。
长字符串不应该换行。
当需要动态字符串时,使用模板字符串而不是拼接。
永远不要使用 eval()。
不要使用不必要的转义字符。
函数
使用命名函数表达式而不是函数声明,避免函数声明导致的提升。
把立即执行函数包裹在圆括号里。
不要在 if、while 等非函数块内声明函数。
不要使用 arguments 命名参数。
不要使用 arguments 变量,用 rest 替代。
在参数列表中指定默认值而不是在函数里进行判断再赋值。
避免默认参数值的副作用,默认值应当简洁直接。
默认参数赋值放在最后。
创建函数不要使用 Function 构造器。
函数定义部分要有空格。
不要修改传入的参数。
使用扩展运算符调用多参数的函数。
调用或者编写一个包含多个参数的函数,参数列表应该换行,每行只有一个参数和一个结尾的逗号。
不要传入不使用的参数。
箭头函数
当一定要使用函数表达式(回调函数)时,使用箭头函数,如果一个函数逻辑复杂,应该把它单独写入一个命名函数里。
如果函数体是一个没有副作用的表达式语句组成,就删除大括号和 return。
如果表达式包含多行就包裹在圆括号里面。
箭头函数的参数用圆括号包裹起来。
避免箭头函数和大于等于、小于等于号混淆。
类与构造函数
使用 class 语法,避免操作原型对象。
使用 extends 实现继承。
方法可以返回 this 实现链式调用。
空构造函数或只是代表父类的构造函数是不需要写的。
避免重复定义类成员。
除非外部库或框架需要使用特定的非静态方法,否则类方法应该使用 this 或被写成静态方法。
派生类需要调用 super。
构造器禁止 return。
模块
使用 export、import 导出、导入模块。
不要使用 import 通配符。
一个文件中的多个模块在一个 import 语句中引入。
不要导出可变的东西。
如果一个文件只导出一个模块,使用 default。
import 语句要放在所有语句之前。
多行的 import 应该缩进。
迭代器与生成器
不要用迭代器而是使用 for-in
、for-of
。
不使用生成器。因为无法很好的转为 ES5。
属性
访问属性使用点符号,如果是变量获取属性使用方括号。
幂运算使用 **
运算符。
变量
使用 const 或 let 声明变量。
不要使用链式声明对象。
不要使用一元自增自减运算符。
赋值的时候避免在等号前后换行,如果等号右边太长可以用圆括号包裹起来。
变量如果不使用就不要声明。
比较运算符与相等
用严格相等和严格不等进行判断。
if 语句使用 ToBoolean 抽象方法来计算表达式,规则:
- Objects 计算成 true。
- undefined 计算为 false。
- null 计算为 false。
- +0、-0、NaN 计算为 false。
- 空字符串(不包含纯空格字符串)计算为 false。
控制语句
当控制语句中的条件太长时要换行,每个条件一行,逻辑运算符放在行首。
注释
单行注释放在被注释区域上面,如果注释不是在第一行,那么注释前面就空一行。
空格
链式调用过长换行时,点符号开头。
一个代码块后的下一条语句前空一行。
不要用空白行填充块。
圆括号、方括号前后不加空格。计算属性要有空格。
[1, 2, 3];
花括号内前后加空格。
调用函数时函数名和小括号之间不要空格。
在对象的字面量属性中,键值之间要空格。
逗号
不要前置逗号。
使用额外的结尾逗号。
分号
语句末尾加分号。
类型转换与强制转换
数字转换使用 Number,parseInt 转换应该带着基数。
布尔转换使用两个取反符号:!!
。
Get-Set 访问器
不要使用属性的访问器函数,可以自定义。、
如果要使用访问器函数那么 get 和 set 要一起使用。
其他
Promise 构造器参数不能是 async。
if 语句等布尔表达式不能是常量。