JS-Google语法(191)

  1. 如果一个值是恒定的,它命名中的字母要全部大写(如 CONSTANT_VALUE_CASE
  2. 一定要分号,js是弱语言,很多时候不要分号也能执行。但是容易出错。

    //函数表达式后面要分号结束,但是函数声明就不需要

    var foo = function() {
        return true;
    };  // 这里要分号
    
    function foo() {
        return true;
    }  // 这里不用分号
    
  3. 不要在块内函数声明,应该使用一个变量初始化函数表达式在块内定义一个函数块

  4. 为了最大的可移植性和兼容性,总是使用标准功能而不是非标准功能(例如,采用 string.charAt(3) 而非 string[3] ,用DOM的功能访问元素而不是使用特定于一个具体应用的简写)。
  5. 原始类型的包装对象,

    var x = new Boolean(false);
    if (x) {//这是错误的,因为x是个object,而不是bool,正确该是var x = Boolean(0);
        alert('hi');  //显示“hi”。
    }
    
  6. 方法和属性定义

虽然有多种使用“new”关键词来创建对象方法和属性的途径,首选的创建方法的途径是:

Foo.prototype.bar = function() {
    /* ... */
};//好像这样能提供性能

其他特性的首选创建方式是在构造函数中初始化字段:

/** @constructor */
function Foo() {
    this.bar = value;
}
  1. 删除,使用this.foo == null,而不是delete
  2. 遍历数组使用for循环 而不是for-in
  3. 多行字符不要使用连接行符,直接’+’
  4. 构建数组对象用字面量,而不是构造函数。

//问题在构造只有一个元素的函数时

var a = new Array(x); //它表示的是开辟一个x大小的数组,内部赋值undifinew;而不是开辟一个数组,内部赋值x;
var a = [x1, x2];
var a = [x1];
var a = [];

对象构造函数,为了一致性:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var o = new Object();
var o2 = new Object();
o2.a = 0;
o2.b = 1;
o2.c = 2;
o2['strange key'] = 3;
改为:
var o = {};
var o2 = {
a: 0,
b: 1,
c: 2,
'strange key': 3
};
//关于对象属性的设置和获取,也最好使用字面量;请看`192`第15条
  1. 强烈禁止修改如 Object.prototype 和 Array.prototype 等对象的原型。
  2. 不要使用条件注释;条件注释会在运行时改变JavaScript语法树,阻碍自动化工具。
  3. 私有 属性和方法应该以下划线开头命名
  4. 保护 属性和方法应该以无下划线开头命名(像公共属性和方法一样)。
  5. 可选函数参数以 opt_ 开头。
  6. 参数数目可变的函数应该具有以 var_args 命名的最后一个参数。
  7. 为了避免在大小写敏感的平台上引起混淆,文件名应该小写。文件名应该以 .js 结尾,并且应该不包含除了 - 或 (相比较 更推荐 - )以外的其它标点
  8. 括号书写:

    if (something) {
    } else {
    }
    
  9. 多行,对象和数组初始化

    var arr = [1, 2, 3];  //之后无空格[或之前]
    var obj = {a: 1, b: 2, c: 3};  //之后无空格[或之前]
    
    //不要像这样:
    
    WRONG_Object.prototype = {
        a          : 0,
        b          : 1,
        lengthyName: 2
    };
    
  10. 匿名函数传递

    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;
        });
    
  11. 字符串使用单引号,虽然js不区分单引号和双引号。

    但是一般html的属性用的是双引号。所以当js字符串为了区分html和转义,最好使用单引号。

  12. 注释可以参考jsdoc的做法
  13. 布尔类型

    下边的布尔表达式都返回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);
        }
    
// //