我的JavaScript代码规范

98 阅读3分钟

从个人的编码历程总结一些经验。如有收获,还请关注——猩猩伸手.jpg

命名规范

变量命名

我们应该根据变量存储的数据或信息来命名变量,而不是它们应该触发的内容。这是因为触发的操作可以随时更改。

  • • 布尔值:is开头或者has

  • • 对象:Obj结尾

  • • 数组:array或者list

  • • 字符串:Str结尾或desc结尾

  • • 数字:count结尾或者length结尾

  • • 变量缩写:单词是六个字符以上且缩写是通用的

  • • 如果想严苛要求:可以有一个项目常用词汇表,之前发现有些人的缩写方式会不一样。

函数/类 命名

类名

应采用名词且具有通用意味,不必加上Manager等带有身份、动作的词汇。那应该是实例的变量名。

函数名

  • • 对于完成某件事的函数使用动词:如filter()

  • • 对于返回布尔值的:如isEmpty()

  • • 对于单纯得到属性的:getCount 或者count都可以

不要因为节省声明变量而无脑复用

一个变量只做一件事,因为会发生阅读问题和数据不明确。

function ninjaFunction(elem) {
  // 基于变量 elem 进行工作的 20 行代码
  
  elem = clone(elem);
  
  // 又来 20 行代码,现在使用的是 clone 后的 elem 变量。
}

避免变量名过度简洁或者不适宜的缩写

例如dynamicValidateForm,缩写成dvf,可阅读性差。

部分复用的常量适当提取

可以设定输入输出的结构,将常量作为固定结构输入,从而使得输出也是预期的。

下划线:仅在常量使用(私有变量)

不过看具体的项目要求,有些eslint会配置成不允许用下划线。

函数体/方法体

边路处理

如果边路处理有必要存在(往往是因为区分不同状态),做相应处理。

在写下if的时候,需要考虑else时的数据状态,否则就会导致bug。

将错误情况前置

  • • 剩下代码皆是正常流程

  • • 减少阅读困难,两个连续的块会增加阅读量

function deal(num){
if(isEmpty(num)) return;
// do something
}

错误提示

无意义的错误提示不如不做。

不必循环获取的不需要存在于循环块中

常量、初始化步骤等只需要一次值的,提取到循环块外。

这种常用于for/while循环中,就不举例了。

传值和传引用

这个问题相当于函数式编程:是否应该编写一些纯函数,让执行过程变得可靠且可控。

这是为了避免在传递值的过程中被动修改了值属性,减少在繁杂处理数据的流程中排查哪一步出现问题的时间。

function deal(originData){
  let data=add(originData);
  data=reduceByArray(data);
  //...等等一系列操作
  // 然后return后发现数据异常,开始一步步排查
  return data
}

复用功能相同的方法

哪怕是状态重置这种初始化的简单语句,也应当提取。

因为提取函数的一个优点在于,函数名编写得当的时候,阅读代码相当于看文档

关于函数参数个数问题

当函数参数过多的时候,可适当利用引用结构(将其变成选项)

function test({need=true}){}

注释

函数注释

需要描述:函数作用、函数参数

vscode中的可利用Document This插件

代码注释

注释应该是注释Why,而不是How和What

在code和commit中,code可以看出what和How,而在commit中也会体现How,所以这时候注释就应该是Why——为什么需要这一段代码?

  • • 废弃代码的注释应该删除

  • • 不必用注释来解释明显的语句

  • • 别在注释里面说需求

  • • TODO型注释记得在完成后删除

----END

推荐阅读

看完一篇文章就该休息了,别看了,推荐个毛啊。该走走动动,放松眼睛和拉伸身体。工作虽重要,但生活才是人生的重点