比起制定什么样的规范,坚持遵守规范重要的多。
为什么要有规范
软件bug的修复极其昂贵,尤其是随着时间的推移,这些bug的成本会成倍增加。因此,无论是为了自己以后维护方便还是为了减少公司的维护成本,书写可维护的代码异常重要。
什么样才是可维护的代码**
1. 可读的
2. 一致的
3. 可预测的
4. 看上去像一个人写的
5. 已记录
如何做
缩进
关于缩进有人喜欢用空格,有人喜欢用tab,记住坚持一直使用同一种方式。
区块
总是使用大括号表示区块,不要出现类似:
if(true) a(); b();
区块首部大括号的位置放在语句后面(这样可以避免return后自动添加分号带来错误),类似这样:
block { ... }
圆括号
表示函数调用时,函数名与左括号之间没有空格。
bar(arg);
表示函数定义时,函数名与左括号之间没有空格。
function bar() {...}
其他情况时,前面位置的语法元素与左括号之间,都有一个空格。
if (a+b) {...}; return (key: value);
行尾的分号
可以不用添加分号的情况
- for和while循环(但do .. while语句必须添加)
- 分支语句:if,switch,try
- 函数的声明语句
其他情况都要加分号(javaScript解释引擎总会在你意想不到的时候添加分号)
空格
适合使用空格的地方包括:
- for循环分号分开后的的部分:如
for (var i = 0; i < 10; i += 1) {...}
- for循环中初始化的多变量(i和max):
for (var i = 0, max = 10; i < max; i += 1) {...}
- 分隔数组项的逗号的后面:
var a = [1, 2, 3];
- 对象属性逗号的后面以及分隔属性名和属性值的冒号的后面:
var o = {a: 1, b: 2};
- 限定函数参数:
myFunc(a, b, c)
- 函数声明的花括号的前面:
function myFunc() {}
- 匿名函数表达式function的后面:
var myFunc = function () {};
- 使用空格分开所有的操作符和操作对象是另一个不错的使用,这意味着在
+, -, *, =, <, >, <=, >=, ===, !==, &&, ||, +=
等前后都需要空格.
全局变量
JavaScript最大的语法缺点,可能就是全局变量对于任何一个代码块,都是可读可写。这对代码的模块化和重复使用,非常不利。
因此,避免使用全局变量。如果不得不使用,用大写字母表示变量名,比如UPPER_CASE。
变量声明
JavaScript会自动将变量声明”提升”(hoist)到代码块(block)的头部。
为了避免可能出现的问题,最好把变量声明都放在代码块的头部。
所有函数都应该在使用之前定义,函数内部的变量声明,都应该放在函数的头部
new 命令
new
方法调用函数时会产生一个新对象,一旦忘记写new操作符,构造函数内的this
就会执行全局对象,这样便增添了许多全局变量。
- 使用
Object.create()
代替new
操作符。 - 将构造函数与其他函数区分开来。构造函数名称首字符大写。
with语句
不要使用with
语句。
相等和严格相等
不要使用“相等”(==
)运算符,只使用“严格相等”(===
)运算符
语句的合并
不要随便合并
自增++
和自减--
运算符
建议自增(++
)和自减(--
)运算符尽量使用+=
和-=
代替。
switch…case结构
建议避免使用switch...case
结构,用对象结构代替。详情见JavaScript标准参考教程
(不)扩展内置原型((Not) Augmenting Built-in Prototypes)
自己手动扩展内置原型,无论是添加属性还是方法,都会给后期的维护带来麻烦。并且私自扩展的属性可能会导致不使用hasOwnProperty属性时在循环中显示出来,这会造成混乱。