和其他许多编程语言一样,JavaScript使用分号(;)将语句分隔开,这对增强代码的可读性一整洁性是非常重要的,缺少分隔符,一条语句的结束就成了下一条语句的开始,反之亦然。在JavaScript中,如果语句各自独占一行,通常可以省略语句之前的分号(程序结尾或右花括号之前的分号也可省略)。不过关于JavaScript中可选的分号有几细节需要注意。
JavaScript并不是在所有换行处都填补分号:只有在缺少分号就无法正确解析时,才会填补分号。换句话说,如果当前语句和随后的非空格字符不能当成一个整体来解析的话,就在当前语句行结束处填补分号。如下代码:
var a a = 3 console.log(a)
将会被解析为
var a; a=3; console.log(a);
JavaScript给第一行换行处添加了分号,因为如果没有分号,JavaScript就无法解析代码。第二个a可以单独当做一条语句"a;",但JavaScript并没有给第二行结尾处填补分号,因为它可以和第三行内容一起解析成"a=3;"。
这些语句的分隔规则会导致一些意想不到的情形,下面这段代码写成了两行,看起来是两条独立的语句:
var y=x+f (a+b).toString()
但第二行的圆括号却和第一行的f组成了一个函数调用,JavaScript会把这段代码看做:
var y=x+f(a+b).toString();
而这段代码的本意并不是这样。为了能让上述代码解析为两条不现的语句,必须手动填写行尾的显式分号。
通常来讲,如果一条语句以"(","[","/","+"或"-"开始,那么它极有可能和前一条语句合在一起解析。以"/","+"和"-"开始的语句并不常见,而以"("和"["开始的语句则非常常见,至少在一些JavaScript编码风格中是很普遍的。有些程序员喜欢保守地在语句前加一个分号,这样哪怕之前的语句被修改了,分号被误删除了,当前语句还是会正确地解析:
var x=0 ;[x,x+1,x+2].forEach(console.log) //前面的分号保证了正确的被解析
如果当前语句和下一行语句无法合并解析,则在第一行后填补分号,这是通用规则,但有两个例外。
第一个是在涉及return, break和continue语句的场景中,如果这三个关键字后紧跟着换行,JavaScript则会在换行处填补分号。
return true;
JavaScript会解析成
return; true;
而代码的本意是
return true;
也就是说,在return, break和continue和随后的表达式之前不能有换行。如果了换行,程序则只有在极特殊的情况下才会报错,而且程序的调试非常不方便。
第二个例外是在涉及到"++"和"--"运算符的时候。这些运算符可以作为表达式的前缀,也可以当作表达式的后缀。如果将其做后缀表达式,它和表达式应当在同一行。否则,行尾将填补分号,同时"++"和"--"将会作为下一行代码的前缀操作符并与之一起解析,例如,这段代码:
x ++ y
将被解析为
x;++y;
而不是
x++;y;
JavaScript夯实基础--关于分号