当存在换行符(line break)时,在大多数情况下可以省略分号。
比如说:
alert('Hello')
alert('World')
会依次弹出‘hello’和‘world’在这,JavaScript 将换行符理解成“隐式”的分号。这也被称为 自动分号插入。
在大多数情况下,换行意味着一个分号。但是“大多数情况”并不意味着“总是”!
有很多换行并不是分号的例子,例如:
1 alert(3 +
2 1
3 + 2);
代码输出 6
,因为 JavaScript 并没有在这里插入分号。显而易见的是,如果一行以加号 "+"
结尾,那么这是一个“不完整的表达式”,不需要分号。所以,这个例子得到了预期的结果
但存在 JavaScript 无法确定是否真的需要自动插入分号的情况。
比如:
alert("There will be an error")
[1, 2].forEach(alert)
现在,如果我们运行代码,只有第一个 alert
语句的内容被显示了出来,随后我们收到了一个错误!
但是,如果我们在第一个 alert
语句末尾加上一个分号,就工作正常了:
alert("All fine now");
[1, 2].forEach(alert)
现在,我们能得到 “All fine now”,然后是 1
和 2
。
无分号的变体(variant)会出现报错,是因为 JavaScript 并不会在方括号 [...]
前添加一个隐式的分号。
所以,因为没有自动插入分号,第一个例子中的代码被视为了一条简单的语句,我们从引擎看到的是这样的:
alert("There will be an error")[1, 2].forEach(alert)
但它应该是两条语句,而不是一条。这种情况下的合并是不对的,所以才会造成错误。诸如此类,还有很多。
即使语句被换行符分隔了,我们依然建议在它们之间加分号。这个规则被社区广泛采用。我们再次强调一下 —— 大部分时候可以省略分号,但是最好不要省略分号,尤其对新手来说。