在 C 语言中,分号是语句结束的标志,在语句结束的地方一定要以分号结束。而 JavaScript 的分号却是可选的,若语句都各占一行,则可以省略分号。这是因为 JavaScript 中的 ASI 机制,允许我们省略分号。
ASI 机制
先分享一个关于 ASI 机制的介绍,感觉这个博主写的很好。ASI 机制不是说在解析过程中解析器自动把分号添加到代码中,而是说解析器除了分号还会以换行为基础按一定的规则作为断句的依据,从而保证解析的正确性。
ECMAScript 标准定义的 ASI 包括 三条规则 和 两条例外。
#三条规则是描述何时该自动插入分号:
1.解析器从左往右解析代码(读入 token),当碰到一个不能构成合法语句的 token 时,它会在以下几种情况中在该 token 之前插入分号,此时这个不合群的 token 被称为 offending token :
·如果这个 token 跟上一个 token 之间有至少一个换行。
·如果这个 token 是 }。
·如果 前一个 token 是 ),它会试图把前面的 token 理解成 do...while 语句并插入分号。
2.当解析到文件末尾发现语法还是有问题,就会在文件末尾插入分号。
3.当解析时碰到 restricted production 的语法(比如 return),并且在 restricted production 规定的 [no LineTerminator here] 的地方发现换行,那么换行的地方就会被插入分号。
#两条例外表示,就算符合上述规则,如果分号会被解析成下面的样子,它也不能被自动插入:
1.分号不能被解析成空语句。
2.分号不能被解析成 for 语句头部的两个分号之一。
建议
虽然不加分号,代码看起来会更加的简洁,但是为了避免歧义,还是句末加上分号比较好。
当然,这个也是看个人习惯,项目一定要风格统一,养成良好的代码习惯。
还有ESLint,这个东西的使用在前期会非常蛋疼,但是用好后,对于保证代码风格的一致性有很好的帮助。
webstorm对于分号机制的设置
见图
此处可以设置项目中是否句末加分号。按Ctrl + alt + L 的时候非常方便。