代码质量

每一种语言都有根据自己的特性量身定做的规范

标识符命名

标识符不但是程序中的语法单位,也可以认为是程序员之间交流的一种"行话"。如果随心所欲的命名,那么形成的很可能不是"行话",而是密码,对于团队开发是一种噩梦。所以,标识符的命名一定要清晰且有明确的含义,通常使用完整单词或者众所周知的单词缩写构成

  • 驼峰命名法:如果一个标识符由多个完整单词或者单词缩写构成,如果统一大写或者小写形式并不有利于阅读,规则很简单,就是将构成标识符的单词或单词缩写的首字符大写,也叫小驼峰
  • 帕斯卡命名法:帕斯卡命名法也叫大驼峰命名法,和小驼峰区别就是所有的首字符全部大写
  • 匈牙利命名法:此命名法对标识符进行了更为精细的划分,传达给阅读者的信息也会更多,标识符的名称构成:属性+类型+功能描述的顺序组合起,表示属性和类型的部分采用小写,功能描述部分首字母大写的一个单词或多个单词组合

在实际工作中具体采用哪种命名规则,则需要根据自己的需要和团队开发的需要,最终的目的是为了自己或者团队合作的便利,并且命名规则一旦确立就要始终执行,不要同一类型的标识符采用不同的命名规则

变量前缀为形容词

// 好
let maxCount = 10;
let tableTitle = '啦啦啦';
// 不好
let setConut = 10;
let getTitle = '啦啦啦';

而常量则全部大写,用下划线分割单词

const MAX_COUNT = 10;

函数前缀使用动词,这是推荐的动词约定:

动词含义
can能够做某个动作
has是否有某个值
is是否为某个值
get获取某个值
set设置某个值
load加载某些数据
on事件处理
// 是否可阅读
function canRead() {}
// 获取名称
function getName() {}

命名过于宽泛,不能精准描述,这是很多代码在命名上存在的严重问题,也是代码难以理解的根源所在。比如下面这些词是不是经常出现在的代码里:data、info、flag、process、handle、build、maintain、manage、modify 等等。这些名字都属于典型的过于宽泛的名字,当这些名字出现在代码里,多半是当时没有想好用什么名字,就开始写代码了

注释规范

注释的总则,能不注释,就尽量不对代码进行注释,以减少体积。如果必须要注释,则注释必须详尽,格式科学,提高代码的可读性。也就是说注释并不是用来美化代码的,而是为了便于自己活着其他程序员的阅读便利性。它是一种负担,但是为了团队开发等目的又是必要的。函数是使用最为频繁的语法结构,相对而言比较复杂,良好的注释会对于理解函数的功能非常有必要

/*
 *@param {参数类型}参数名 参数说明
 *@return {返回值类型} 返回值说明
 *@fix 需要处理的bug
*/

简单的例子:

/*
 *@param {Number} v1 传入一个Number类型的值
 *@param {Number} v2 传入一个Number类型的值
 *@return {Number} 返回最大值
 *@fix 没有对参数进行类型检测
*/

function getMaxValue(v1, v2) {
  if(v1 > v2) return v1;
  return v2;
}

知道为什么需要注释,也就知道注释应该怎么写。注释的目的是告诉阅读者不宜察觉或者不易获取到的信息,而不是一目了然的东西,比如废话:

// 声明一个变量 timer
let timer = null;

只要不是蠢得可以,都知道上面是声明的一个变量,根本用不着注释。应该强调这个变量将来要发生的作用,修改如下:

// 用来存储定时器函数的标识
let timer = null;

省略分号

关于 JavaScript 语句后面是否应该省略分号,有两种截然相反的意见。一种意见是,语句后面应该时时刻刻使用分号,另一种则是尽量不使用分号,甚至完全不使用

当然作为一种编码习惯,没有所谓的应该不应该,只有习惯不习惯,或者说喜欢不喜欢。如果达到比较高的水准,能够确保不会出错,那么可以尽可能的省略分号的使用

加不加分号并不是重点,重要的是掌握什么时候加分号,什么时候不加会出现意外。JavaScript 解析器会将换行看做当前语句的一部分,除非人为添加一个分号结束当前行语句。以下代码是会被正确的解析,可以认为是 JavaScript 解析器自动填补了分号

let foo = null
let bar = null;

如果编码时语句是以下形式,则会报错,因为解析器检测到了两个声明变量,其中一个没有分号,则会在一行末尾添加分号

let foo = null let bar = null;

利用这个特点,可以在一些语句上巧用这个方法来达到目的,以下代码本意是返回字符串“你也想起舞吗”,实际上返回的是undefined,因为对于return来说,如果后面是换行,解析器会自动在后面添加一个分号

function fn() {
  return
  "你也想起舞吗"
}

for 循环中的分号是绝对不能省略的,即使没有任何参数

比较判断

JavaScript中,如果要比较两个数据,最好使用带有类型判断的方式,以下代码母的是判断两个数值相同,但使用的不是全等运算符,这就导致结果可能出现意外,所以应使用全等运算符比较:

let a = 2;
let b = 3;
console.log((a == b));
console.log((a === b));

需要注意的是不要盲目的全部使用,而是尽量使用带有类型判断的比较

应使用字面量创建数组和对象

创建对象或者数组可以通过两种方式:构造函数和字面量赋值方式。两种方式都是等效的,但更推荐字面量方式创建

构造函数:

let arr = new Array(1,2,3,4,5);
let obj = new Object();
obj.name = foo;
obj.age = 18;

字面量:

let arr = [1,2,3,4,5];
let obj = {
  name: foo,
  age: 18
}