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() {
};
以上三种情况,如果使用了分号,并不会出错。因为,解释引擎会把这个分号解释为空语句。
2.分号的自动添加
除了上一节的三种情况,所有语句都应该使用分号。但是,如果没有使用分号,大多数情况下,JavaScript 会自动添加。
var a = 1
// 等同于
var a = 1;
这种语法特性被称为“分号的自动添加”(Automatic Semicolon Insertion,简称 ASI)。
因此,有人提倡省略句尾的分号。麻烦的是,如果下一行的开始可以与本行的结尾连在一起解释,JavaScript 就不会自动添加分号。
只有下一行的开始与本行的结尾,无法放在一起解释,JavaScript 引擎才会自动添加分号。
if (a < 0) a = 0
console.log(a)
// 等同于下面的代码,
// 因为 0console 没有意义
if (a < 0) a = 0;
console.log(a)
另外,如果一行的起首是“自增”(++)或“自减”(–)运算符,则它们的前面会自动添加分号。
a = b = c = 1
a
++
b
--
c
console.log(a, b, c)
// 1 2 0
上面代码之所以会得到1 2 0的结果,原因是自增和自减运算符前,自动加上了分号。上面的代码实际上等同于下面的形式。
a = b = c = 1;
a;
++b;
--c;
如果continue、break、return和throw这四个语句后面,直接跟换行符,则会自动添加分号。这意味着,如果return语句返回的是一个对象的字面量,起首的大括号一定要写在同一行,否则得不到预期结果。
return
{ first: 'Jane' };
// 解释成
return;
{ first: 'Jane' };
由于解释引擎自动添加分号的行为难以预测,因此编写代码的时候不应该省略行尾的分号。
不应该省略结尾的分号,还有一个原因。有些 JavaScript 代码压缩器(uglifier)不会自动添加分号,因此遇到没有分号的结尾,就会让代码保持原状,而不是压缩成一行,使得压缩无法得到最优的结果。
另外,不写结尾的分号,可能会导致脚本合并出错。所以,有的代码库在第一行语句开始前,会加上一个分号。
;var a = 1;
// ...
上面这种写法就可以避免与其他脚本合并时,排在前面的脚本最后一行语句没有分号,导致运行出错的问题。
来源:网道 / WangDoc.com