- 如果一个值是恒定的,它命名中的字母要全部大写(如
CONSTANT_VALUE_CASE
) 一定要分号,js是弱语言,很多时候不要分号也能执行。但是容易出错。
//函数表达式后面要分号结束,但是函数声明就不需要
var foo = function() { return true; }; // 这里要分号 function foo() { return true; } // 这里不用分号
不要在块内函数声明,应该使用一个变量初始化函数表达式在块内定义一个函数块
- 为了最大的可移植性和兼容性,总是使用标准功能而不是非标准功能(例如,采用 string.charAt(3) 而非 string[3] ,用DOM的功能访问元素而不是使用特定于一个具体应用的简写)。
原始类型的包装对象,
var x = new Boolean(false); if (x) {//这是错误的,因为x是个object,而不是bool,正确该是var x = Boolean(0); alert('hi'); //显示“hi”。 }
方法和属性定义
虽然有多种使用“new”关键词来创建对象方法和属性的途径,首选的创建方法的途径是:
Foo.prototype.bar = function() {
/* ... */
};//好像这样能提供性能
其他特性的首选创建方式是在构造函数中初始化字段:
/** @constructor */
function Foo() {
this.bar = value;
}
- 删除,使用this.foo == null,而不是delete
- 遍历数组使用for循环 而不是for-in
- 多行字符不要使用连接行符,直接’+’
- 构建数组对象用字面量,而不是构造函数。
//问题在构造只有一个元素的函数时
var a = new Array(x); //它表示的是开辟一个x大小的数组,内部赋值undifinew;而不是开辟一个数组,内部赋值x;
var a = [x1, x2];
var a = [x1];
var a = [];
对象构造函数,为了一致性:
|
|
- 强烈禁止修改如 Object.prototype 和 Array.prototype 等对象的原型。
- 不要使用条件注释;条件注释会在运行时改变JavaScript语法树,阻碍自动化工具。
- 私有 属性和方法应该以下划线开头命名
- 保护 属性和方法应该以无下划线开头命名(像公共属性和方法一样)。
- 可选函数参数以 opt_ 开头。
- 参数数目可变的函数应该具有以 var_args 命名的最后一个参数。
- 为了避免在大小写敏感的平台上引起混淆,文件名应该小写。文件名应该以 .js 结尾,并且应该不包含除了 - 或 (相比较 更推荐 - )以外的其它标点
括号书写:
if (something) { } else { }
多行,对象和数组初始化
var arr = [1, 2, 3]; //之后无空格[或之前] var obj = {a: 1, b: 2, c: 3}; //之后无空格[或之前] //不要像这样: WRONG_Object.prototype = { a : 0, b : 1, lengthyName: 2 };
匿名函数传递
prefix.something.reallyLongFunctionName('whatever', function(a1, a2) { if (a1.equals(a2)) { someOtherLongFunctionName(a1); } else { andNowForSomethingCompletelyDifferent(a2.parrot); } }); var names = prefix.something.myExcellentMapFunction( verboselyNamedCollectionOfItems, function(item) { return item.name; });
字符串使用单引号,虽然js不区分单引号和双引号。
但是一般html的属性用的是双引号。所以当js字符串为了区分html和转义,最好使用单引号。- 注释可以参考jsdoc的做法
布尔类型
下边的布尔表达式都返回false: //@ null undefined ''空字符串 数字0 //但是要小心,因为以下这些返回true: 字符串"0" []空数组 {}空对象 //@所以 while (x != null) {}这样不好, 该是 while(x) {} //if (y != null && y != '') {} 也改成 if (y) {} //@二元布尔操作符是可短路的,所以 var win; if (opt_win) { win = opt_win; } else { win = window; } //可以改成: function foo(opt_win) { var win = opt_win || window; } if (node) { if (node.kids) { if (node.kids[index]) { foo(node.kids[index]); } } } //可以改成: var kid = node && node.kids && node.kids[index]; if (kid) { foo(kid); }