JavaScript 表达式后应不应该加分号?

我们在看源代码时,我们经常会发现有的源代码 Javascript 表达式后面加了分号,有的却没有加,难免心中产生疑惑:Javascript 表达式后面到底该不该加分号呢?

其实 Javascript 表达式没有应不应该加分号明确规定,全凭个人习惯,也就是说你加也可以不加也不会出错。Javascript 语法长得有点像 C-like, 但不代表它本质上和 C 是一类语言,不过《JavaScript高级程序设计》一书提到:虽然语句结尾的分号不是必须的,但我们建议任何时候都不要省略它。因为加上这个分号可以避免很多错误(例如不完整的输入),开发人员也可以放心地通过删除多余的空格来压缩 ECMAScript 代码(代码行结尾处没有分号会导致压缩错误)。另外,加上分号也会在某些情况下增进代码的性能,因为这样解析器就不必要再花时间推测应该在哪里插入分号。后来新设计的语言里可选分号的多得去了,光是 “可以加分号但是大家都不加” 的语言就有:Go, Scala, Ruby, Python, Swift, Groovy…

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

eslint –fix 已经支持自动添加删除分号,另外 prettier 1.0 现在也支持无分号选项,在不同 style 之间迁移的成本已经接近 0 了。

上面提到加上分号会在某些情况下会增进代码的性能。那么问题来了:加或不加分号是否影响JS执行性能?

我们都清楚无论是解释执行还是编译执行,代码先要被 parse 成 AST(抽象语法树),在 AST 中是没有分号这个东西的,也就是说单纯执行本身,是不可能因为有无分号而造成性能差异的,所以唯一会有差异的是在 parsing 代码的阶段。而 parsing 本身是一次性的,因此通常不可能是性能问题的重点,何况 ASI(自动分号插入)只是整个 parsing 的很小一点。有人实际测试过相同代码在依赖 ASI 或不依赖 ASI 下的性能差异,据说较早版本的 V8 下,依赖 ASI(即不加分号)略慢,但较新版本则反之。也有人认为性能测试结果在统计上没有差异。无论如何,实测结果都表明即使有差异,也小到完全可忽略。

您的支持将鼓励我继续创作!