JavaScript 语句后应该加分号么?

关注者
1,396
被浏览
708,582

149 个回答

正巧参加了2012的Backbone.js conference,现场很多大神也都讨论了这个非常火热的话题。最后大家公认的结论是这样的:

加与不加是风格问题,风格争议不需要有个定论。关键的问题在于如何“争论”,处理好冲突,学会组织语言减少争议是最重要的。因为分号问题在社区内部造成了很多况日持久的口水战,这些口水战是社区的损失……因为大家在这个时候可以写更多的代码带来更多的功能。
类似的问题还有AMD的module,有的库选择兼容AMD,有的人不愿意。公认结论是应该尊重作者的选择,不要因为这些风格问题而fork。module loader应该设法绕过这些问题,提供兼容的解决方案。
How not to argue about semicolons?

Andrew Dupont的Slides在这里,欢迎阅读:slideshare.net/savethec

没有应该不应该,只有你自己喜欢不喜欢。JavaScript 语法长得 C-like 不代表它本质上和 C 是一类语言,所有直觉性的 “当然应该加分号” 都是保守的、未经深入思考的草率结论。后来新设计的语言里可选分号的多得去了,光是 “可以加分号但是大家都不加” 的语言就有:Go, Scala, Ruby, Python, Swift, Groovy...

至于说 “很难总结什么时候加不加”,其实真的很简单。真正会导致上下行解析出问题的 token 有 5 个:括号,方括号,正则开头的斜杠,加号,减号。我还从没见过实际代码中用正则、加号、减号作为行首的情况,所以总结下来就是一句话:一行开头是括号或者方括号的时候加上分号就可以了,其他时候全部不需要。其实即使是这两种情况,在实际代码中也颇为少见。

另外,restricted production 这个东西(也就是导致 return 后面换行会自动插入分号的机制),不管你加不加分号你都是得搞懂了才能不被坑的,和加不加分号没有什么关系。

更多细节,可以看我曾经给过的一个 talk:

Hacking Semicolons by Evan You

最后,上点代码好了,Vue.js 的代码全部不带分号:

yyx990803/vue · GitHub

另外说到工具,我确实写了一个,全自动帮你批量添加或者删除分号:

yyx990803/semi · GitHub

做成 Git pre-commit hook,选择你自己喜欢的风格就可以。

更新:eslint --fix 已经支持自动添加删除分号,另外在我的强烈要求下 prettier 1.0 现在也支持无分号选项,在不同 style 之间迁移的成本已经接近 0 了。