所有块语句都应当使用花括号,包括:if、for、while、do…while…
花括号的对齐方式
第一种对齐风格:
if (condition) {
doSomething();
} else {
doSomethingElse();
}
javascript代码这种风格继承自Java,这在java的编程规范中有明确规定。
第二种对齐风格:
if (condition)
{
doSomething();
} else
{
doSomethingElse();
}
Google Javascript风格指南中明确禁止这种用法,以免导致错误的分号自动插入。
所以书中强烈推荐使用第一种花括号对齐风格。
快语句对齐风格
// 1
if(condition){
doSomething();
}
// 2
if (condition) {
doSomething();
}
// 3
if ( condition ) {
doSomething()
}
青睐于使用第二种风格的编码。
switch语句
switch(condition) {
case "first":
// 代码
break;
case "second":
// 代码
break;
default:
// 代码(当没有默认行为的时候,可以省去default语法结构)
}
for
var values = [1, 2, 3, 4, 5, 6, 7],
i, len;
for (i=0, len=values.length; i < len; i++) {
if (i == 2) {
break; // 迭代不会继续
}
process(values[i]);
}
这里的循环体执行了两次,然后在第三次执行process()之前就终止循环了,尽管values数组中的元素超过三个。不管所有循环迭代有没有执行完毕,使用break总是可以立即退出循环。
var values = [1, 2, 3, 4, 5, 6, 7],
i, len;
for (i=0, len=values.length; i < len; i++) {
if (i == 2) {
continue; // 跳过本次迭代
}
process(values[i]);
}
第二种改变循环过程使用continue,continue立即退出本次循环,而进入下次循环。这里的循环体将执行两次,跳过第三次迭代,而进入第四次迭代,循环继续执行直到最后一次迭代。
推荐尽可能避免使用continue,但不是禁止使用,应当根据代码可读性决定,比如可以将上一个例子修改为:
var values = [1, 2, 3, 4, 5, 6, 7],
i, len;
for (i=0, len=values.length; i < len; i++) {
if (i != 2) {
process(values[i]);
}
}
for-in循环
for-in 循环是用来遍历对象属性的,循环遍历每个对象属性,并返回属性名而不是属性值,比如:
var prop;
for (prop in object) {
console.log("Property name is " + prop);
console.log("Property value is " + object[prop]);
}
for-in 循环有一个问题,就是它不仅遍历对象的实例属性,还遍历从原型继承来的属性。
当遍历自定义对象的属性时,往往可能会发生意外。出于这个原因,最好使用hasOwnProperty() 方法来为for-in循环过滤出实例属性。如下:
var prop;
for (prop in object) {
if (object.hasOwnProperty(prop)) {
console.log("Property name is " + prop);
console.log("Property value is " + object[prop]);
}
}
书中推荐总是在for-in循环中使用hasOwnProperty()。
当然如果你想要查找原型链,这时候就应当做出补充注释,如下:
var prop;
for (prop in object) { // 包含对原型链的遍历
console.log("Property name is " + prop);
console.log("Property value is " + object[prop]);
}
关于for-in循环,还有一点需要注意,for-in循环是用来遍历对象的。
一个常见的错误是使用for-in循环来遍历数组成员,如下代码:
var values = [1, 2, 3, 4, 5],
i;
for (i in values) {
process(items[i]);
}
始终记住,for-in循环是用来对实例对象和原型链的键做遍历的,而不是用来遍历包含数字索引的数组的。
文章内容从《编写可维护的Javascript》[美] Nicholas C. Zakas著 一书中总结写出。