JS中分号作为分隔符的使用

在JS中,我们经常会在句尾用到分号“;”,像许多其他编程语言一样,这是用来将语句分隔开。分号对提高代码的可读性和整洁性是不可缺少的。没有了分隔符,一条语句的末尾就成了下一条语句的起始。在JavaScript中,如果语句各自独占一行,通常可以不用语句之间的分号(程序结尾或右花括号“}”之前的分号也可以免去)。

关于JavaScript中可选分号的问题有几个细节需要注意。

1.

     a = 3;
     b = 4;

因为两条语句用两行写,第一个分号是可以去掉的。

     a = 3;b = 4;

如果按照如下规范书写,第一个分号则不能去掉

2.

如果当前语句和随后的非空格字符不能当成一个整体来解析的话,JavaScript就在当前语句行末尾添加分号。

     var a
     a 
     =
     3
     console.log(a)

JS将其解析为:

    var a;a=3;console.log(a);

JavaScript给第一行换行处添加了分号,因为如果没有分号,JavaScript就无法解析代码var a a。第二个a可以单独当做一条语句"a;",但JavaScript并没有给第二行结尾填补分号,因为它可以和第三行内容一起解析成“a=3;”。


3.

var y=x+f
(a+b).toString()

本是独立的两个语句,却会被解析成:

var y=x+f(a+b).toString();

通常来讲,如果一条语句以“(”、“[”、“/”、“+”或“-”开始,那么它极有可能和前一条语句合在一起解析。以“/”、“+”和“-”开始的语句并不常见,而以“(”和“[”开始的语句则非常常见,至少在一些JavaScript编码风格中是很普遍的。有些程序员喜欢保守地在语句前加上一个分号,这样哪怕之前的语句被修改了、分号被误删除了,当前语句还是会正确地解析:

4.

如果当前语句和下一行语句无法合并解析,JavaScript则在第一行后填补分号,这是通用规则,但有两个例外。第一个例外是在涉及return、break和continue语句的场景中。如果这三个关键字后紧跟着换行,JavaScript则会在换行处填补分号。

return
true;

JavaScript会解析成:


return;true;

而代码的本意是这样:


return true;

第二个例外是在涉及“++”和“——”运算符的时候。这些运算符可以作为表达式的前缀,也可以当做表达式的后缀。如果将其用做后缀表达式,它和表达式应当在同一行。否则,行尾将填补分号,同“时“++”或“——”将会作为下一行代码的前缀操作符并与之一起解析,例如,这段代码:


x
++
y

这段代码将解析为

x;++y


而不是

x++;y