Javascript 分號戰爭

Cypressyi
Cypressyi’s TechNote
2 min readJan 31, 2018

日前 TC39 委員會有人開了一個 Pull request,希望能將使用分號寫入規範,於是對於 JS 要不要使用分號又展開了一些討論。

會有這樣的狀況發生,是因為 ECMAScript 語言的設計,擁有 Automatic Semicolon Insertion(ASI)的機制,也就是會在語句間自動幫你加入分號,但是在一些規則下 Javascript 會曲解你的語意,不加分號就會出現錯誤,於是在一段時間後出現兩種常見的撰寫風格,「加分號」或「不加分號」。

不過其實這樣講有點不太正確,因為兩者都是以 正確使用 Javascript 分號 為前提在使用的。

加分號 vs 不加分號

加分號

Airbnb JS Style Guide 是建議加分號的,優點是 JS 能夠正常運行(痾當然),並且 ASI 可能會隨著日後 JS 新特性加入而變得更複雜,維持這樣的良好習慣無論怎樣的情況都能保持程式的穩定。

缺點是要記得加分號,一但不小心忘記就可能造成程式錯誤,另外實際上有些句子結束是不需要加分號的,比如:

function func () {
}
if () {
}
for () {
}
while () {
}

在一些巢狀的句子裡面,你往往需要往前看這個 } 是對應怎樣的句子,他到底需不需要分號?

不加分號

嚴格上來說不加分號其實不是不加,而是在開頭是:

+ — [  (  /  `

這樣的句子才加,因為這些句子是實際會造成 ASI 判斷錯誤的因素,優點是你只需要遵循上面的規則,比起向前去看 { 開頭片段,判斷需不需要加上分號來說,思維負擔會比較小,StandardJS 主要推薦這樣的格式。

工程實踐

不過實際上除了理解 ASI 的機制外,主要還是使用 Linter 比如 ESLint 去提醒我們要不要加上分號,不然都靠眼睛跟習慣還是容易不小心忽略了。

參考資料

JavaScript ASI 機制詳解

Eddychang:JavaScript裡的語句用分號結尾是個選項嗎

相關討論串

Evan You Twitter

BrendanEich Twitter

知乎討論:JavaScript 語句後應該加分號麼?

--

--