pcwu's TIL Notes


[JS] 句尾是否需要分號(semicolons)?

Intro

在 JavaScript 中句尾分號似乎是個可有可無的存在,大家都是不喜歡麻煩的,如果能少一個分號,省麻煩看起來又清爽,何樂而不為呢?

所以很多人會在 .eslintrc 加上這段:

rules:
  semi: ["error", "never"]

來關閉此條規則。但最知名的 Airbnb JavaScript Style Guide 卻還是要大家保留,怎麼一回事?

standard.js

standard.js 的規則中有2條是跟分號有關的:

看起來相當簡單,就是不用分號!但為了不用分號,開頭就不能出現 (, [, 或 `,因為會出錯,像這樣:

foo()
[1,2,3].forEach(bar) // error

解決的辦法就是,既然不能在句尾加分號,那不如在句首加吧:

foo()
;[1,2,3].forEach(bar) // ok!

Issue open by gaearon

但 Redux 發明的大神 gaearon 為此感到相當不滿,覺得 standard.js 不該訂這2條規則,也不該取 “standard” 這個名字讓人家誤會這是一個標準。畢竟像 eslint 都預設是 semi: always

大神開的討論串:Issue 78: “No semicolons” is the opposite of practical

gaearon 認為:

{ a, b } = something()
;[a, b] = something()

不如下面這個,還比較制式:

{ a, b } = something();
[a, b] = something();

而且 destructuring 是 ES6 標準了,以 [ 開頭的程式碼只會愈來愈多:

[a, b] = c; // destructuring

而且也是一個很好的交換方式:

[a, b] = [b, a]

semistandard

後來有人乾脆出了一個叫 semistandard ,就是所有規則都跟原本的 standard 一樣,唯獨使用分號,最有名的 mocha 就是使用這個。

我也不太懂太多細節,不過先跟著 eslint, mocha, airbnb 和 gaearon,先保留使用分號吧!

Reference