Skip to content

起因

最近在阅读Vue相关的代码时发现尤大的代码行末都没有分号,这让我这强迫症着实难受。

我们都知道JS本身是一门不强制分号结尾的语言,不加分号不会影响解释器运行JS代码,但是在大学写C++/Java这样强制分号语言写习惯的我, 自然也把这种习惯带到了JS上。虽然知道可以不写分号,但是我都会主动的在语句末尾加上一个分号,这对我来说可以让思路更清晰,代码更整洁。

为什么大佬不写分号?

参考这一篇尤大在知乎的回答 JavaScript 语句后应该加分号么?
总结一下就是:

  1. JS语法长得像C-like,不代表他和C就是同一类语言,所有直觉性的 “当然应该加分号” 都是保守的、未经深入思考的草率结论
  2. 后来很多设计的新语言都不强制加分号。
  3. 有一些情况不加分号会出问题,但出现的可能性很低。
  4. 总之,没有应不应该,只有喜不喜欢。

什么时候不加分号会出问题?

如果一条语句以“(”、“[”、“/”、“+”、或“-”开始,那么它极有可能和前一条语句合在一起解释
—— <<JavaScript权威指南>>

  1. 以括号开头(立即执行函数)
javascript
a = b
(function() {
 
})()

// 实际上被解释成了
a = b(function() {

})();
  1. 以方括号开头(裸数组调用)
javascript
a = function() {
 
}
[1,2,3].forEach(function(item) {
 
});

// 实际上被解释成了
a = function() {
}[1,2,3].forEach(function(item) {

});
  1. 以左斜杆开头(正则表达式)
javascript
a = 'abc' 
/[a-z]/.test(a)

// 实际上被解释成了
a = 'abc'/[a-z]/.test(a);

4.以加号开头(强制转为数字)

javascript
a = b
+c

// 实际上被解释成了
a = b + c;

5.以减号开头(强制转为数字并求负)

javascript
a = b
-c

// 实际上被解释成了
a = b - c;

6.在return后换行

javascript
return
{
    a: 1
}

// 自动在return后补上了分号
return;
{
  a: 1
}
  1. 自增运算符
javascript
x
++
y

// 实际上被解释成了
x;
++y;

总结

如果之前就有使用分号的习惯,那么应该保持下去,可以避免一些不必要的错误,如果不喜欢使用分号,那么就要注意避免出现上面的那些情况。

扩展阅读

  1. 知乎
  2. Hacking Semicolons
  3. 自动分号插入机制