其他規範:
縮排
統一兩個空格縮排
變數宣告
區域性變數一定要宣告,避免全域性汙染
- 推薦使用
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]; } 複製程式碼
註釋
-
使用
/** ... */
進行多行註釋. 請在你們加入註釋說明,指明引數和返回值的型別/** * make() returns a new element * based on the passed in tag name * @param <String> tag * @return <Element> element */ 複製程式碼
-
使用
//
進行單行註釋. 請用一個新行來新增註釋。並在註釋行前增加一個空行// 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; } 複製程式碼