有很多关于“我应该使用分号吗?”的问题和“分号注入(inject)是如何工作的?”,但我想为决定要尽可能避免使用分号的编码人员找到无 FUD 的建议。
如果有人有,比如izs或者选择编写不带分号的 Javascript 的 Bootstrap 开发人员,在什么情况下他们必须添加分号,他们还应该做些什么来确保他们的代码不会失败?
最佳答案
避免意外合并两行
假设您打算使用换行符代替分号,一个经常被忽视的错误是将两行组合成一个表达式的代码。
例如下面的代码:
// DANGEROUS
a = b + c
(d + e).print()
将被解释为:
a = b + c(d + e).print()
解决方法是:
// SAFE
a = b + c
;(d + e).print()
类似的问题出现在:
// DANGEROUS
console.log()
['three', 'two', 'one'].forEach(console.log)
所以一般来说,推荐遵循的规则是:
When a line starts with a parenthesis
(
or[
or with an arithmetic operator
+
-
*
/
or regexp/.../
then put a semicolon
;
in front of it.
(但是请注意,++
--
和 //
没有分号也是安全的。)
(您实际上永远不会单独编写 *
或 /
,因此以这种方式开始一行是没有意义的,但有时您可能想要开始一个行与 /.../
正则表达式。在这种情况下,如果不使用分号,这很可能会导致语法分析错误。 (
[
+
-
情况更危险,因为它们会导致运行时错误。)
来源:
- Semicolons in Javascript are optional我发现了 here
- Inimino 的文章 JavaScript Semicolon Insertion
避免在开始和结束时合并级联文件
出于类似的原因,分号也是可取的在库脚本的开头和结尾,这将被发布到野外。事实上,无论您在脚本中使用何种样式,都建议这样做。
在这个例子中有一个 IIFE :
// my-library.js
;(function(){
...
})();
前导分号将确保您的外括号
(...)
不会尝试在您之前连接的脚本尾部调用未终止的表达式.尾随分号是一种很好的做法,以防在您的脚本之后串联的脚本以 IIFE 开头而忽略了以其自己的分号开头。
作为替代方案,Bootstrap 以 +
开头,不将 IIFE 包装在 (...)
中,并以 ;
结尾>。其他变体以 !
开头,而不是 +
或 ;
。
分号正常的地方
唯一需要分号的时间是在传统的 for 循环中:
for (var i = 0; i < 10; i++) { // good luck doing that without semicolons!
并且当您以其他方式在一行中放置多个语句时:
x = obj[k]; delete obj[k]; return asChar(x)
使用 linter
某些 linter 会检测您的代码何时可能产生意想不到的后果,并鼓励您遵循上述做法。
比如所谓的standardjs linter 将检测上面提出的问题。 (他们也发布了 eslint config 如果您更喜欢使用 eslint,但我不确定这些规则有多全面。)
关于javascript - 我必须遵循哪些规则才能编写不带分号的有效 Javascript?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25088708/