为什么要使用分号?

37

除了主观的视觉感知和存在多个语句在同一行的情况外,在JavaScript语句结尾处使用分号的理由是否存在其他的原因呢?

看起来有足够的证据表明使用分号是高度可选的,并且只在少数特定情况下需要使用。


8
虽然当你说“除了主观视觉感知之外”时,我感觉你试图贬低声音编码约定的重要性。因为编码约定不就是通过吸引主观视觉感知来帮助别人理解你的代码吗?+1 - flybywire
飞线,说得好,但我只是不想让这个问题被 SO mods 关闭,因为他们已经对我在 Python 上发布的问题做过了。希望你能理解。 - Art
这是一篇很棒的文章,展示了只有6种容易记忆的情况需要使用分号:http://inimino.org/~inimino/blog/javascript_semicolons - johnsimer
5个回答

35

22
猜测?它遵循严格的规则,开发人员应该花5分钟学习,然后如果他们选择,可以删除无用的字符。此外,“白痴盒子”是指电视... - Ryan Florence
3
关于 JavaScript 分号的优秀文章:http://mislav.uniqpath.com/2010/05/semicolons/(注意,这是一个链接,需要单击才能访问该文章。) - makevoid
7
多糟糕的答案啊。JavaScript 解释器从不“猜测”在哪里放置分号。开发者可能会“猜测”ASI规则,但这永远不是一个好主意。开发者应该理解他们使用的语言。 - the system
最好了解语句的终止方式,而不是盲目地使用分号,因为你“必须”这样做或者有人告诉你应该这样做:http://inimino.org/~inimino/blog/javascript_semicolons - B T
这个编程语言的创造者告诉我们应该这样做,新手们请看:https://brendaneich.com/2012/04/the-infernal-semicolon/ - Cliffmeister
显示剩余2条评论

17

1
+1 ... 好文章:http://blog.izs.me/post/2353458699/an-open-letter-to-javascript-leaders-regarding - the system
3
aresemicolonsnecessaryinjavascript.com的HTML版本链接为:http://jsfiddle.net/ju2kqcn2/embedded/result/。 - donut
他们应该将这个放在js.org下面。 - wildeyes

13
如果你来自Python背景并问起这个问题:两者的区别在于:
  • 在Python中,你不应该使用任何东西来终止行,但是如果必要,可以使用分号;

  • 在JavaScript中,你应该使用分号来终止行,但是如果没有歧义,可以省略它(PDF第26页,第7.9点)


2
正确使用分号的少数基于事实的论点之一。 - Michael J. Calkins
“为什么?”这听起来像是宗教原因,而不是经验丰富的理由。“如果您默认情况下不使用分号,JavaScript可能会变得复杂,因为......”“Python没有这个问题,因为......” - paul23
1
我真的不明白你的评论与我的回答有什么关系。我没有给出任何个人偏好,只是引用了语言自身文档的相关方面。 - Boldewyn

12

因为:

  • 如果没有写分号,调试时遇到隐晦的错误会浪费你本可以用来做更酷的事情的时间。
  • 写分号能让后来维护代码的人更清楚你的意图。
  • 并不是所有维护代码的人都足够理解自动插入分号的规则,以至于不能顺利地维护代码。
  • 省略分号要求在工具链中处理 JavaScript 代码的所有工具都恰当地遵守这些规则(例如,某些缩小器/打包器/压缩器不会这样做,包括 Crockford 的 jsmin,这将打破依赖于某些地方的 ASI 的代码)。

@T.J.Crowder 这更多是关于将开放括号放在同一行而不是关于分号的论点,不是吗?JS会在return后的换行符处放置分号,无论对象文字末尾是否有分号。解决这个问题的唯一方法(假设开放括号总是有自己的行)是在与return相同的行上打开括号并将文字放在括号内。 - General Grievance
@GeneralGrievance - 是的,return 这个例子不太好,我已经删除了那个注释。这里有一个更好的例子:const fn = function() { console.log("fn") } <linebreak> (() => { console.log("inline") })()。我最近在一个项目中遇到了这种情况,他们没有使用任何格式化保存工具。(如果使用了,我想我会注意到奇怪的重新格式化。:-)) - T.J. Crowder

10

正如道格拉斯·克罗克福德(Douglas Crockford)所建议的-

在每个简单语句的末尾加上一个; (分号)。请注意,将函数文字或对象文字分配给变量的赋值语句仍然是赋值语句,并且必须以分号结尾。


Douglas Crockford 的说法是错误的,即“赋值语句...必须以分号结尾”,因此... - B T
3
Crockford 的陈述并不是“客观准确”的。他提出了一个建议,以及如果你遵循这个建议必须遵守的规则。 - worc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接