# Javascript规范

# 1.分号

# 强制语句必须都有分号结尾,除了for, function, if, switch, try, while

# 2. 缩进

# 强制 使用空格而非Tab来缩进, 一层缩进=4个空格

# 3. 命名

# 强制 常量使用大写字符, 下划线连接

var SECONDS_IN_A_MINUTE = 60;
obj.TEXT_WARNNING = '警告';

# 强制 标准变量: 驼峰

var myCount = 1;

# 强制 构造函数: 驼峰且大写第一个字母

function Point(x, y) {
    this.x = x;
    this.y = y;
}

# 建议 私有方法: 驼峰且加_前缀

function MyClass() {
    var _privateNum;
    this.getNum = function() {
        return _privateNum;
    };
}

// 虽然不建议这么写一个对象(建议用闭包来写)
// 但如果真这么写了, 请把意图上不想暴露的变量, 用_开头
var myCounter = {
    _count: 1,
    get: function() {
        return this._count;
    }
};

# 建议 对布尔型的变量, 命名时加is,has,can前缀

# 强制 不要使用让人糊涂的命名

var isNotError;
var isNotClosed;

# 强制 当出现以下字符时,统一拼写

var iOSVersion; //iOS
var AndroidVersion; //Android
var classID,teacherID,mID; //ID
var jumpURL; //URL
var normalHTML, isXML; //HTML
var HTTPHeader; //HTTP
//... 待补充

# 建议 字符串常量或字面量使用时, 使用单引号而非双引号

var str = '<span class="info">';
str += 'some infomation</span>';

# 4. 代码风格

# 强制 即使是单行,也需要加花括号

正确
//更建议换行写
if (isUndead) {
    grabFire();
}
//一定要一行,也必须这样
if (isUndead) { grabFire(); }
错误
if (isUndead) grabFire();

# 强制操作符前后要有空格分隔

//运算符
var a = 1 + 2;
var thaco = hit + adjustment - randomFactor;

//三元操作符
var num = val ? foo() : bar();
var fn = JSON.parse ? JSON.parse : function() {
    //...
};

# 强制对象属性的冒号前无空格,后跟一个空格

var myObject = {
    propA: 1
};

# 建议逗号位置: Last comma

建议 (last comma)

var foo = 1,
    bar = 2,
    baz = 3;

var obj = {
    foo: 1,
    bar: 2,
    baz: 3
};

不推荐 (first comma)

var foo = 1
  , bar = 2
  , baz = 3;

var obj = {
    foo: 1
  , bar: 2
  , baz: 3
};

# 注意一定不要多写逗号了

错误
var list = [
    {n: 1},
    {n: 2}, //<----- 会导致IE报错, GCC默认参数压缩也会报错
];

# 建议function的参数括号: 前后都加一个空格, 若非匿名函数, 则名字和括号之间不再需要空格

//匿名函数, function和括号间有空格, 括号和花括号间也有空格
var fn = function (param) {
    //...
}
//带名字的函数, function和括号间有空格, 但插入的名字和括号间就无需再加空格了
function foo() {
    return "bar";
}

# 建议条件判断括号: 前后都加一个空格

推荐
if (true) {
    //...
}

while (true) {
    //...
}

switch (v) {
    //...
}
不推荐
if(true) {
    //...
}

while(true) {
    //...
}

switch(v) {
    //...
}

# 建议括号紧挨两端处不要空格, 中间有逗号, 逗号后加空格

推荐
function fn(arg1, arg2) {
    //...
}
var fn = function (arg) {
    //...
}
if (true) {
    //...
} else {
    //...
}
var arr = [1, 2, 3];
不推荐
function fn( arg1, arg2 ) {
    //...
}
var fn = function ( arg ) {
    //...
}
if ( true ) {
    //...
}
else {
    //...
}
var arr = [ 1, 2, 3 ];

# 建议 if...else 写法

if (condition1) {
    doSomething1();
} else if (condition2) {
    doSomething2();
} else {
    doSomethingElse();
}

# 建议 switch...case 写法

switch (condition) {
    case "first":
        // code
        break;

    case "third":
        // code
        break;

    default:
        // code
        break;
}
switch (condition) {
    case "first":
    case "second": //上一行不用加fall though: 两个case紧挨, jshint不会报错
        // code
        break;

    case "third":
        // code
        /* falls through */
    case "fourth": //上一行必须加, 否则jshint会报错
        // code
        break;

    default:
        // code
        break;
}

# 强制函数参数过多时的排版: 两层缩进

正确
var localMonsterRumors = getLocalGossip(inkeeper,
        localInn, numberOfClerics, pintsOfAlePurchased,
        charismaAjustment);
错误
var localMonsterRumors = getLocalGossip(inkeeper,
                                          localInn,
                                          numberOfClerics,
                                          pintsOfAlePurchased,
                                          charismaAjustment);

# 建议采用临时变量来提高复杂判断或字符串拼接的可读性

错误
if ( (conditionAA && conditionAB) || (conditionBA && conditionBB) ){
    //...
}

var elem = document.getElementById('charClass-' + charClass +
      + '_combatStats-' + armorClass + '-' + toHitBonus);
正确
var conditionA = conditionAA && conditionAB;
var conditionB = conditionBA && conditionBB;
if (conditionA || conditionB) {
    //...
}

var strChar = 'charClass-' + charClass;
var strCombat = 'combatStatus-' + armorClass + '-' + toHitBonus;
var elem = document.getElementById(strChar + '_' + strCombat);

# 建议逻辑块 之间使用空行

# 5. 杂项

# 建议尽量使用标准方法而不是用非标准方法

例: 优先用string.charAt(3) 而不用 string[3]

# 强制不要修改内置对象的原型

主要是为了不污染原型从而对外部造成不好的影响 如Array.prototype,Object.prototype

# 强制避免 == != 的使用, 用严格比较条件 === !==

# for...in

# 建议对数组遍历时, 用下标的for循环而非for...in

# 注意使用for...in时要注意利用hasOwnProperty排除掉可能的原型污染干扰

# with,eval

# 强制如非特殊情况, 不允许使用with,eval

# 多行字符串

# 强制不要使用转义字符''的方式来写多行字符串

# 强制也不要使用function内注释再toString的hack来定义和使用多行字符串

# 保留字

# 强制对象的属性如果是保留字, 请务必使用引号定义,方括号引号引用

正确
var example = {
    "new": function () {}
};

var fn = example['new'];
错误
var example = {
    new: function () {}
};

var fn = example.new;

# 注释

# 单行注释优先

# 优先使用单行注释(即使是需要写多行), 除了以下情况

# 优先使用多行注释的情况

  • fileoverview / constructors
  • public method

# 多行注释

/**
 * this method is ...
 * @param {Object} ...
 * @return {Object} ...
 */

# //todo: 大块注释怎么写

# //todo: switch规避jshint的一种特殊情形

创建人:yinyanting

快速跳转