采用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一书,感受还不错,在此分享。