採用2個空格縮進,而不是tab縮進。空格在編輯器中與字符是等寬的,而tab可能因編輯器的設置不一樣。2個空格會讓代碼看起來緊湊、明快。html
永遠用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;
在操做符先後須要加空格,好比 +、-、*、%、=等操做符先後都應該存在一個空格,示例以下:數組
1 var foo = 'bar' + baz;
錯誤的示例以下所示:安全
1 var foo='bar'+baz;
此外,在小括號的先後應該存在空格,如:異步
1 if (true) { 2 // some code 3 }
錯誤的示例以下所示:編輯器
1 if(true){ 2 // some code 3 }
因爲雙引號在別的場景下使用較多,在Node中使用字符串時儘可能使用單引號,這樣無需轉義,如:函數
1 var html = '<a href="http://cnodejs.org">CNode</a>';
而在JSON中,嚴格的規範是要求字符串用雙引號,內容中出現雙引號時,須要轉義。測試
通常狀況下,大括號無需另起一行,如
1 if (true) { 2 // some code 3 }
錯誤的示例以下所示:
1 if (true) 2 { 3 // some code 4 }
逗號用於變量聲明的分割或是元素的分割。若是逗號不在行結尾,前面須要一個空格。此外逗號不容許出如今行首,好比:
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 ];
給表達式結尾加根號。儘管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 var adminUser = {};
錯誤的示例以下:
1 var admin_user = {};
方法命名與變量命名同樣,採用小駝峯式命名。與變量不一樣的是,方法名儘可能採用動詞或判斷行詞彙,如:
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 () {};
類名採用大駝峯式命名,即全部單詞的首字母都大寫,如:
1 function User(){ 2 }
做爲常量時,單詞的全部字母都大寫,並用下劃線分割,如:
1 var PINK_COLOR = "pink";
命名文件時,請儘可能採用下劃線分割單詞,好比child_process.js和string.decode.js。若是你不想將文件暴露給其餘用戶,能夠約定如下劃線開頭,如_linklist.js
若是你有貢獻模塊並將其打包發佈到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);
導出
全部供外部調用的方法或變量均需掛載在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一書,感受還不錯,在此分享。