所谓“编程风格”,指的是编写代码的样式规则。
程序员固然可以自由选择编程风格,但是好的编程风格有助于写出质量更高、错误更少、更易于维护的程序。
所以,”编程风格”的选择不应该基于个人爱好、熟悉程度、打字量等因素,而要考虑如何尽量使代码清晰易读、减少出错。你选择的,不是你喜欢的风格,而是一种能够清晰表达你的意图的风格。这一点,对于JS这种语法自由度很高的语言尤其重要。
一、缩进
空格和Tab键,都可以产生缩进效果(indent)。
Tab键可以节省击键次数,但不同的文本编辑器对Tab的显示不尽相同,有的显示四个空格,有的显示两个空格,所以有人觉得,空格键可以使得显示效果更统一。
无论你选择哪一种方法,都是可以接受的,要做的就是始终坚持这一种选择。不要一会使用Tab键,一会使用空格键。
二、区块
如果循环和判断的代码体只有一行,JS允许该区块省略大括号。
但是这样容易造成错误,建议总是使用大括号表示区块。
表示区块起首的大括号,不要另起一行。因为JS会自动添加句末的分号,导致一些难以察觉的错误。
return
{
key: value
};
// 相当于
return;
{
key: value
};
三、圆括号
圆括号在JS中有两种作用,一种表示函数的调用,一种表示表达式的组合。
// 圆括号表示函数的调用
console.log('abc');
// 圆括号表示表达式的组合
(1 + 2) * 3
我们可以用空格,区分这两种不同的括号。
1、表示函数调用时,函数名名与左括号之间没有空格。
2、表示函数定义时,函数名与左括号之间没有空格。
3、其他情况时,前面位置的语法元素与左括号之间,都有一个空格。
四、行尾的分号
分号表示一条语句的结束。JS规定,行尾的分号可以省略。事实上,确实有一些开发者行尾从来不写分号。但是,强烈建议还是不要省略这个分号。
4.1、不需要使用分号的情况
有一些语法结构不需要在语句的结尾添加分号,主要是以下三种情况。
(1)for和while循环
for ( ; ; ) {
} // 没有分号
while (true) {
} // 没有分号
需要注意的是do...while
循环是有分号的。
do {
a--;
} while(a > 0); // 分号不能省略
(2)分支语句:if,switch,try
if (true) {
} // 没有分号
switch () {
} // 没有分号
try {
} catch {
} // 没有分号
(3)函数的声明语句
function f() {
} // 没有分号
但是函数表达式仍然要使用分号。
var f = function f() {};
以上三种情况,如果使用了分号,并不会出错。因为,解释引擎会把这个分号解释为空语句。
4.1、其它情况一律要写上分号,不要让JS引擎去猜测
五、全局变量
JS最大的语法缺点,可能就是全局变量对于任何一个代码块,都是可读可写。这对代码的模块化和重复使用,非常不利。
因此,尽量避免使用全局变量。
六、变量声明
JS会自动将变量声明”提升”到代码块的头部。
为了避免可能出现的问题,最好把变量声明都放在代码块的头部。
所有函数都应该在使用之前定义,函数内部的变量声明,都应该放在函数的头部。
七、new命令
JS使用new
命令,从构造函数生成一个新对象。
var o = new myObject();
上面这种做法的问题是,一旦你忘了加上new
,myObject()
内部的this
关键字就会指向全局对象,导致所有绑定在this
上面的变量,都变成全局变量。
因此,建议使用Object.create()
命令,替代new
命令。如果不得不使用new
,为了防止出错,最好在视觉上把构造函数与其他函数区分开来。比如,构造函数的函数名,采用首字母大写,其他函数名一律首字母小写。
八、with语句
不要使用with
语句。
九、相等和严格相等
JS中有两个表示“相等”的运算符:“相等”和“严格相等”。
因为“相等”运算符会自动转换变量类型,造成很多意想不到的情况。因此,不要使用“相等”(==
)运算符,只使用“严格相等”(===
)运算符。
十、语句的合并
有些程序员追求简洁,喜欢合并不同目的的语句。比如,原来的语句是
a = b;
if (a) { // ...}
他喜欢写成下面这样。
if (a = b) { // ...} //赋值永远都会成功
虽然语句少了一行,但是可读性大打折扣,而且会造成误读,让别人误解这行代码的意思是下面这样。
if (a === b){ // ...}
建议不要将不同目的的语句,合并成一行。
十一、自增和自减运算符
自增(++
)和自减(--
)运算符,放在变量的前面或后面,返回的值不一样,很容易发生错误。事实上,所有的++
运算符都可以用+= 1
代替。
十二、switch...case结构
switch...case
结构要求,在每一个case
的最后一行必须是break
语句,否则会接着运行下一个case
。这样不仅容易忘记,还会造成代码的冗长。
而且,switch...case
不使用大括号,不利于代码形式的统一。
建议避免使用switch...case
结构,用对象结构代替。
(本系列完结)