Node編碼規範

編碼規範

1. 縮進

採用2個空格縮進,而不是tab縮進。空格在編輯器中與字符是等寬的,而tab可能因編輯器的設置不一樣。2個空格會讓代碼看起來緊湊、明快。html

2. 變量聲明

永遠用var聲明變量,不加var時會將其變爲全局變量,這樣可能會意外污染上下文,或是被意外污染。在ECMAScript5的scrict模式下,未聲明的變量將會直接拋出ReferenceError異常。node

須要說明的是,每行聲明都應該帶上var,而不是隻有一個var,示例代碼以下;sql

1 var assert = require('assert'); 
2 var fork = require('child_process').fork; 
3 var net = require('net'); 
4 var EventEmitter = require('events').EventEmitter; 

 

錯誤的示例以下所示:express

1 var assert = require('assert') 
2   , fork = require('child_process').fork 
3   , net = require('net') 
4   , EventEmitter = require('events').EventEmitter; 

3. 空格

  在操做符先後須要加空格,好比 +、-、*、%、=等操做符先後都應該存在一個空格,示例以下:數組

1 var foo = 'bar' + baz; 

  錯誤的示例以下所示:安全

1 var foo='bar'+baz; 

  此外,在小括號的先後應該存在空格,如:異步

1 if (true) { 
2   // some code 
3 } 

  錯誤的示例以下所示:編輯器

1 if(true){ 
2   // some code 
3 } 

 

4. 單雙引號的使用

  因爲雙引號在別的場景下使用較多,在Node中使用字符串時儘可能使用單引號,這樣無需轉義,如:函數

1 var html = '<a href="http://cnodejs.org">CNode</a>'; 

而在JSON中,嚴格的規範是要求字符串用雙引號,內容中出現雙引號時,須要轉義。測試

5. 大括號的位置

  通常狀況下,大括號無需另起一行,如

1 if (true) { 
2   // some code 
3 } 

  錯誤的示例以下所示:

1 if (true) 
2 { 
3   // some code 
4 } 

6. 逗號

  逗號用於變量聲明的分割或是元素的分割。若是逗號不在行結尾,前面須要一個空格。此外逗號不容許出如今行首,好比:

var foo = 'hello', bar = 'world'; // 或是 var hello = { foo: 
'hello', bar: 'world' }; // 或是 var world = ['hello', 'world'];

  錯誤的示例以下所示:

 1 var foo = 'hello' 
 2   , bar = 'world'; 
 3 // 或是
 4 var hello = {foo: 'hello' 
 5   , bar: 'world' 
 6 }; 
 7 // 或是
 8 var world = [ 
 9   'hello' 
10   , 'world' 
11 ]; 

7. 分號

  給表達式結尾加根號。儘管Javascript編譯器會自動給行尾添加分號,但仍是會帶來一些誤解,示例以下:

1 function add() { 
2   var a = 1, b = 2 
3   return 
4   a + b 
5 } 

  將會獲得undefined的返回值。由於自動加入分號會變成以下的樣式:

1 function add() { 
2   var a = 1, b = 2; 
3   return; 
4   a + b; 
5 } 

  後續的a + b將不會執行。

  而以下的代碼:

x = y 
(function () { 
}()) 
// 執行時會獲得
x = y(function () {}()) 

  因爲自動添加分號可能會帶來未預期的結果,因此添加上分號有助於避免誤會。

命名規範

  在編碼過程當中,命名是重頭戲。好的命名能夠令代碼賞心悅目,帶來愉悅的閱讀享受,令代碼具備良好的可維護性。命令的主要範疇有變量、常量、方法、類、文件、包等。

1. 變量命名

  變量名都採用小駝峯式命名,即除了第一個單詞的首字母不大寫外,每一個單詞的首字母都大寫,詞與詞之間沒有任何特殊符號,如:

1 var adminUser = {}; 

  錯誤的示例以下:

1 var admin_user = {}; 

2. 方法命名

  方法命名與變量命名同樣,採用小駝峯式命名。與變量不一樣的是,方法名儘可能採用動詞或判斷行詞彙,如:

1 var getUser = function () {}; 
2 var isAdmin = function () {}; 
3 User.prototype.getInfo = function () {}; 

  錯誤的示例以下:

1 var get_user = function () {}; 
2 var is_admin = function () {}; 
3 User.prototype.get_info = function () {}; 

3. 類命名

  類名採用大駝峯式命名,即全部單詞的首字母都大寫,如:

1 function User(){  
2 }

4. 常量命名

  做爲常量時,單詞的全部字母都大寫,並用下劃線分割,如:

1 var PINK_COLOR = "pink"; 

5. 文件命名

  命名文件時,請儘可能採用下劃線分割單詞,好比child_process.js和string.decode.js。若是你不想將文件暴露給其餘用戶,能夠約定如下劃線開頭,如_linklist.js

6. 包名

  若是你有貢獻模塊並將其打包發佈到NPM上。在包名中,儘可能不要包含js或node的字樣,它是重複的。包名應當適當短且有意義的,如:

1 var express = require('express'); 

比較操做

  在比較操做中,若是是沒法容忍的場景,請儘可能使用 === 代替 ==,不然你會遇到下面這河陽不符合邏輯的結果:

1 '0' == 0; // true 
2 '' == 0 // true 
3 '0' === '' // false 

  此外,當判斷容忍假值時,能夠無需使用 === 或 ==。在下面的代碼中,當foo是0、undefined、null、false、‘ ’ 時,都會進入分支:

1 if (!foo) { 
2   // some code 
3 } 

字面量

  請儘可能使用{}、[]代替new Object()、new Array(),不要使用string、bool、number對象類型,即不要使用new String、new Boolean 和 new Number。

做用域

  在JavaScript中,須要注意一個關鍵字和一個方法,它們是with和eval(),容易引發做用域混亂。

1. 慎用with

  示例代碼以下:

1 with (obj) { 
2   foo = bar; 
3 }

  它的結果有多是以下四種之一:obj.foo = obj.bar; 、obj.foo = bar;、 foo = bar;、 foo = obj.bar;,這些結果取決於它的做用域。若是做用域鏈上沒有致使衝突的變量存在,使用它則是安全的。但在多人合做的項目中,這並不能保證,因此要慎用with。

2. 慎用eval

 

數組與對象

在JavaScript中,數組其實也是獨享,可是二者在使用時有些細節須要注意。

1.字面量格式

  建立對象或者數組時,注意在結尾用逗號分隔。若是分行,一行只能一個元素,示例代碼以下:

1 var foo = ['hello', 'world']; 
2 var bar = { 
3   hello: 'world', 
4   pretty: 'code' 
5 }; 

  錯誤示例以下所示:

1 var foo = ['hello', 
2 'world']; 
3 var bar = { 
4   hello: 'world', pretty: 'code' 
5 }; 

2.for in 循環

  使用for in循環時,請對對象使用,不要對數組使用,示例代碼以下:

1 var foo = []; 
2 foo[100] = 100; 
3 for (var i in foo) { 
4   console.log(i); 
5 } 
6 for (var i = 0; i < foo.length; i++) { 
7   console.log(i); 
8 } 

在上述代碼中,第一個循環只打印一次,而第二個循環則打印0~100,這並不知足預期的值。

3.不要把數組當作對象使用

  儘管在JavaScript內部實現中能夠把數組當作對象來使用,以下所示:

1 var foo = [1, 2, 3]; 
2 foo['hello'] = 'world'; 
3 這在for in迭代時,會獲得全部值
4 for (var i in foo) { 
5   console.log(foo[i]); 
6 } 
7 也許你只是想獲得hellow而已。

異步

在Node中,異步使用很是普遍而且在實踐過程當中造成了一些約定,這是以往未曾在乎的點。

1.異步回調函數的第一個參數應該是錯誤指示

  並非全部的回調函數都須要將第一個參數設計爲錯誤對象,可是一旦涉及異步,將會致使try catch沒法捕獲到異步回調期的異常。將第一個參數設計爲錯誤對象,告知調用方是一個不錯的約定。示例代碼以下。

1 function(err, data){
2 };

這個約定被不少流程控制庫所採用。遵循這個約定,能夠享受社區流程控制庫帶來的業務編寫遍歷。

2.執行傳入的回調函數

  在異步方法中一旦有回調函數傳入,就必定要執行它,且不能屢次執行。若是不執行,可能形成調用一直等待不結束,屢次執行也可能會形成未預期的結果。

類與模塊

關於如何在JavaScript中實現繼承,有各類各樣的方式,但在Node中咱們只推薦一種,那就是類繼承的方式。另外,在Node中,若是要將一個類做爲一個模塊,就須要在乎它的導出方式。

1.類繼承

 通常狀況下,咱們採用Node推薦的類繼承方式,示例代碼以下:

1 function Socket(options) { 
2   // ... 
3   stream.Stream.call(this); 
4   // ... 
5 } 
6 util.inherits(Socket, stream.Stream); 
  1. 導出

    全部供外部調用的方法或變量均需掛載在exports變量上。當須要將文件作一個類導出時,須要經過以下的方式掛載:

1 module.exprots = Class; 

而不是經過
1 exports = Class; 

  私有方法無需由於測試等緣由導出給外部,因此無需掛載。

註釋詳解

  通常狀況下,咱們會對每一個方法編寫註釋,這裏採用dox的推薦註釋,示例以下:

 1 /** 
 2   * Queries some records 
 3   * Examples: 
 4   * ``` 
 5   * query('SELECT * FROM table', function (err, data) { 
 6   * // some code 
 7   * }); 
 8   * ``` 
 9   * @param {String} sql Queries 
10   * @param {Function} callback Callback 
11   */ 
12 exports.query = function (sql, callback) { 
13   // ... 
14 }; 

 

  dox的註釋規範來自與JSDoc。能夠經過註釋生成對應的API文檔。

本文摘抄自 樸靈的深刻淺出Node.js一書,感受還不錯,在此分享。

相關文章
相關標籤/搜索