JS可选的分号
js使用分号(;)将语句分隔开,来增加代码的可读性和整洁性。
在js中,如果语句独自占一行,通常可以省略(;),但是不建议省略,带有分号的代码可读性要好很多。
下面示例用来说明,什么情况下分号必须,什么情况下分号可以省略。
1. a = 3;
b = 4; // 两条语句各自占一行,此时两条语句后的分号可以省略。
2. a = 3; b =4; // 两条语句在一行书写,所以第一个分号不能省略,第二个分号则可以省略
我们来看下面这段代码:
var a
a
=
3
console.log("a的结果是:" + a) // a的结果是:3
这段代码非常不规范,很垃圾的代码,所以初学者一定要养成编码规范。
为什么?
我们来解释一下上面代码发生了什么:
js并不是在所有换行处都填补分号,只有在缺少分号就代码无法正确解析的时候,js才会填补分号。
换句话说,如果当前语句和随后的非空格字符不能当成一个整体来解析的话,js就在当前语句行结束处填补分号。
上面的代码最终会被js解析为:
var a; a = 3; console.log("a的结果是:" + a);
通常来讲,如果一条语句以"("、"["、"/"、"+"、"-"开始的时候,那么它极有可能和前一条语句合在一起解析。
例如:
var x = 1, a = 2, b = 3, f = 4
var y = x + f
(a + b).toString()
console.log("y的结果是:" + y);
直接运行上面代码:会抛出 Uncaught ReferenceError: f is not defined 错误。我们定义一个f函数
function f(val) {
return val;
}
重新运行:y的结果是:15 (可以想到,y最终等于 x的值作为字符串,与 (a+b).toString()的字符串进行了拼接)
显然:
var y = x + f
(a + b).toString()
被js解析为:
var y = x + f(a + b).toString() ;
这显然并不是我们代码的本意。
有些程序员,喜欢保守的在每一行语句前加上分号,例如:
var x = 1, a = 2, b = 3, f = 4
; var y = x + f
; (a + b).toString()
; console.log("y的结果是:" + y); // y的结果是:5
开发人员应该按照团队的编码规范,来指导自己的编码风格。
一般情况下,当前语句和下一行语句无法合并解析的时候,js则会在第一行后填补分号,但是有两个例外:
(1)涉及到return、break、continue语句,如果这三个关键字后紧跟换行,js则会在换行处添加分号。
function changeTrue() {
return
true;
}
var bool = false;
bool = changeTrue();
console.log("bool的结果是:" + bool); // bool的结果是:undefined
此处结果并不是我们本意想得到的结果:true
changeTrue() 最终会被解析为: return; true;
(二)涉及"++"或"--"运算符的时候,这些运算符可以作为表达式前缀,或者后缀。如果作为后缀,它和表达式应当在同一行,否则,行尾会填补分号。
var x = 1, y = 1;
x
++
y
console.log("x的结果是:" + x); // x的结果是:1
console.log("y的结果是:" + y); // y的结果是:2
可以看出上面代码被js解析为:
x; ++y; 而并非我们本意 x++; y;
所以呢?还是那句话:
编码规范性特别重要,尤其初学者,一定要养成良好的编码规范性。