[JS] 句尾是否需要分號(semicolons)?
Intro
在 JavaScript 中句尾分號似乎是個可有可無的存在,大家都是不喜歡麻煩的,如果能少一個分號,省麻煩看起來又清爽,何樂而不為呢?
所以很多人會在 .eslintrc
加上這段:
rules:
semi: ["error", "never"]
來關閉此條規則。但最知名的 Airbnb JavaScript Style Guide 卻還是要大家保留,怎麼一回事?
standard.js
在 standard.js 的規則中有2條是跟分號有關的:
- No semicolons – It’s fine. Really!
- Never start a line with
(
,[
, or ` : This is the only gotcha with omitting semicolons – automatically checked for you!
看起來相當簡單,就是不用分號!但為了不用分號,開頭就不能出現 (
, [
, 或 `,因為會出錯,像這樣:
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,先保留使用分號吧!