缩进
统一两个空格缩进
变量声明
局部变量一定要声明,避免全局污染
推荐使用let全面代替var,因为它创建了块级作用域变量(变量只在代码块内生效),尤其是for循环
建议自由在逻辑上是常量的情况才使用 const,它代表常量,定的同时必须赋值
单引号
使用 string 时,用单引号替代双引号(写 JSON 时除外)
推荐:
var foo = ‘bar’;
var http = require(‘http’);
复制代码不推荐:
var foo = ‘bar’;
var http = require(‘http’);
复制代码命名规范
变量命名采用小驼峰命名,如:addUser password studentID
常量命名采用单词所有字母大写,并用下划线分隔,如:FORM_NAME
对于对象、函数、和实例采用小驼峰(camelCase)命名法
// 对象
let isObject = {};
// 函数
function isFun(){
…
};
// 实例
let myBbj = new Object();
复制代码
对于类命名或者构造函数,采用大驼峰命名 User() DateBase()
// 类
class Point {
…
};
// 构造函数
function User(options) {
this.name = options.name;
}
let myBbj = new User({
name: ‘yup’
});
复制代码
赋值提升
在变量作用范围的最顶端声明变量
全等
比较操作时必须使用全等符号,’=‘和’!’
类型转换
在声明语句的最前端执行强制类型转换
// -> string:
var totalScore = ‘’ + this.reviewScore;
复制代码
使用 parseInt 来进行整数的类型转换,并且始终提供一个基数.
var inputValue = ‘4’;
var val = parseInt(inputValue, 10);
复制代码
使用字面表达式
用 {} ,[] 代替 new Array ,new Object
Requires
建议使用以下顺序来组织 node 代码中的 require 代码
1.core modules
2.npm modules
3.others
var http = require(‘http’);
var fs = require(‘fs’);
var async = require(‘async’);
var mongoose = require(‘mongoose’);
var Car = require(’./models/Car’);
复制代码
引入模块时,不要加 .js 后缀
var Batmobil = require(’./models/Car’);
复制代码
避免魔鬼数字的出现
魔鬼数字主要指在代码中没有具体含义的数字、字符串。影响了代码可读性,读者看到的数字无法理解其含义,从而难以理解程序的意图。当程序中出现的魔鬼数字过多时,代码的可维护性将会急剧下降,代码变得难以修改,并容易引入错误。
要求将魔鬼数字定义为常量,并增加注释
// 接口成功返回的标识
const SUCCESS_CODE = 1;
// 接口失败返回的标识
const FAIL_CODE = 0;
$.ajax({
url: baseUrl + ‘v1/activity/getAct’,
cache: false,
type: ‘GET’,
dataType: ‘json’,
success: function(result) {
if (result.ret === SUCCESS_CODE) {
…
}else if(result.ret === FAIL_CODE){
…
}
}
});
复制代码函数设计
从意义上应该是一个独立的功能模块
函数名要在一定程度上反映函数的功能
函数名要在一定程度上反映函数的功能
当函数参数不应该在函数体内部被修改时,应加上 const 声明
避免函数有过多的参数,参数个数尽量控制在 4 个以内
一个函数只做一件事,就要尽量保证抽象层级的一致性,所有语句尽量在一个粒度上。若在一个函数中处理多件事,不利于代码的重用
回调函数
在回调函数中要始终检测错误,并返回错误
function getAnimals(done) {
Animal.get(function(err, animals) {
if (err) {
// 返回错误
return done(err);
}
// 建议回调函数中使用描述性的参数
return done(null, {
dogs: animals.dogs,
cats: animals.cats
});
});
}
复制代码Try catch
在同步调用中多使用 Try catch 去捕获错误,如:JSON.parse()应该使用 try-catch 语句块
var data;
try {
data = JSON.parse(jsonAsAString);
} catch (e) {
//handle error - hopefully not with a console.log
console.log(e);
}
复制代码构造函数
在原型链上增加属性,而不是覆写原型链
推荐:
function Jedi() {
console.log(‘new jedi’);
}
Jedi.prototype.fight = function fight() {
console.log(‘fighting’);
};
Jedi.prototype.block = function block() {
console.log(‘blocking’);
};
复制代码不推荐:
function Jedi() {
console.log(‘new jedi’);
}
Jedi.prototype = {
fight: function fight() {
console.log(‘fighting’);
},
block: function block() {
console.log(‘blocking’);
}
};
复制代码
使用 class 关键字,并使用 extends 关键字来继承
class Queue {
constructor(contents = []) {
this._queue = […contents];
}
pop() {
const value = this._queue[0];
this._queue.splice(0, 1);
return value;
}
}
class PeekableQueue extends Queue {
peek() {
return this._queue[0];
}
}
复制代码
在方法中返回 this 以方便链式调用
推荐:
class Jedi {
jump() {
this.jumping = true;
return this;
}
setHeight(height) {
this.height = height;
return this;
}
}
const luke = new Jedi();
luke.jump()
.setHeight(20);
复制代码不推荐:
Jedi.prototype.jump = function() {
this.jumping = true;
return true;
};
Jedi.prototype.setHeight = function(height) {
this.height = height;
};
const luke = new Jedi();
luke.jump(); // => true
luke.setHeight(20); // => undefined
复制代码
箭头函数
当你必须使用函数表达式(或传递一个匿名函数时),使用箭头函数符号(能够自动绑定this到父对象)
推荐:
[1, 2, 3].map((x) => {
return x * x
});
复制代码不推荐:
[1, 2, 3].map(function(x) {
return x * x;
});
复制代码
总是用括号包裹参数,即便只有一个参数
推荐:
let foo = (x) => x + 1;
复制代码不推荐:
let foo = x => x + 1;
复制代码
对于对象、类中的方法,使用增强的对象字面量
推荐:
let foo = {
bar () {
// code
}
}
复制代码不推荐:
let foo = {
bar: () => {
// code
}
};
let foo = {
bar: function() {
// code
}
};
复制代码
…扩展运算符
函数参数永远不要使用类数组对象 arguments,使用 … 操作符来代替
推荐:
function concatenateAll(…args) {
return args.join(’’);
}
复制代码不推荐:
function concatenateAll() {
const args = Array.prototype.slice.call(arguments);
return args.join(’’);
}
复制代码
使用 … 来拷贝数组
推荐:
const itemsCopy = […items];
复制代码不推荐:
const len = items.length;
const itemsCopy = [];
let i;
for (i = 0; i < len; i++) {
itemsCopy[i] = items[i];
}
复制代码
注释
使用/** … /进行多行注释. 请在你们加入注释说明,指明参数和返回值的类型
/*
使用 // 进行单行注释. 请用一个新行来添加注释。并在注释行前增加一个空行
// is current tab
var active = true;
function getType() {
console.log(‘fetching type…’);
// set the default type to ‘no type’
var type = this._type || ‘no type’;
return type;
}