javaScript中什么时候用分号“;”?
参考(一)译文:JavaScript分号使用指南
参考(二)《JavaScript权威指南》(第六版)P30
(1)在JavaScript中如果语句各自独占一行,通常可以省略语句之间的分号(程序结尾或右花括号“}”之前的分号也可以省略)。
(2)JavaScript并不是在所有换行处都填补分号:只有在缺少了分号就无法正确解析代码的时候,JavaScript才会填补分号。(懒惰性)
var a
a
=
3
console.log(a)
JavaScript将其解析为:
var a;a=3;console.log(a);
JavaScript给第一行换行处添加了分号,因为如果没有分号,JavaScript就无法解析代码var a a。第二个a可以当做一个语句“a;”,但JavaScript并没有给第二行结尾填补分号,因为它可以和第三行内容一起解析为“a=3;”。
依赖JavaScript的自动填补分号很可能导致一些意想不到的问题:
var y=x+f
(a+b).toString()
看起来像两条独立的语句,但是第二行的圆括号和第一行的f组成一个函数调用,JavaScript会把这段代码看做:
var y=x+f(a+b).toString();
而这段代码的本意并不是这样。为了能让上述代码解析为两条不同的语句,必须手动填写行位的显式分号。
如果当前语句和下一行的语句无法合并解析,JavaScript则在第一行后填补分号,这是通用规则,但是有两个例外。
第一个例外:在涉及return、break、continue语句的场景中。如果这三个关键字后紧跟着换行,JavaScript会在换行处填补分号。
return
true;
JavaScript会解析成
return;true;
第二个例外是涉及“++”“--”运算符的时候。这些运算符可以作为表达式的前缀,也可以当做表达式的后缀。如果将其用作后缀表达式,它和表达式应当在同一行,否则,行位将填补分号,同时“++”或“--”将会作为下一行代码的前缀操作符并与之一起解析。
x
++
y
将会解析为
x;++y
而不是
x++;y