在 JavaScript 當中 ; 被用來作為分隔表達式語句(statement)符號;然而,你知道在 2000 年時的 ECMAScript(ES3)中,有自動插入分號機制(Automatic Semicolon Insertion)會幫你自動插入分號嗎?
結尾是否一定得分號?
如序文所述,在 JavaScript 當中主要是用來分隔表達式語句(statement)符號,而在 ES3 中新增的自動插入分號機制(Automatic Semicolon Insertion)則是基於當你一段程式碼後按下 Enter (也就是實際上寫入一個換行符號(\n))時,JavaScript parser 就有一定規則的幫你補分號進去程式。
瀏覽器基於 ECMAS-262 spec Automatic Semicolon Insertion 規則而實作的結果就是,有些地方就算你不寫他也會幫你補、有些則是你不寫他也不會幫你補;但另一群例外則是你一定得補分號跟不能補分號的情況。
所以情境大致上可分為:
- 不會 ASI 的情境
- 會 ASI 的情境
- 一定要補分號的情境
- 一定不能補分號的情境
- 不需要補分號的情境
不會 ASI 的情境
| 12
 3
 4
 5
 6
 7
 8
 9
 
 | var frult = ['apple',
 'banana'
 ]
 
 var lyrics = `
 你看這碗又大又圓
 你看這麵又長又寬
 `
 
 | 
| 12
 3
 4
 5
 6
 
 | var a = 1+1
 ++
 a
 
 console.log(a)
 
 | 
| 12
 3
 4
 5
 
 | var a = 1if(a)
 console.log('true')
 else
 console.log('false')
 
 | 
| 12
 3
 4
 5
 6
 
 | if(a)console.log('true')
 
 
 else
 console.log('false')
 
 | 
一定要補分號的情境
| 12
 3
 
 | var a; var b;
 if (a); if (b)
 
 | 
| 12
 3
 4
 5
 6
 
 | console.log('log')
 
 (function(){
 console.log('IIFE')
 }())
 
 | 
防禦手段可以透過前置分號來幫忙:
| 12
 3
 4
 5
 6
 7
 
 | ;(function(){console.log('IIFE')
 }())
 
 ;['array'].map(function(element){
 console.log(element)
 })
 
 | 
一定不能多補分號的情境
- for 迴圈小括號中的兩個分號是固定值 | 12
 3
 
 | for (;;){ } 
 for(i=0; i<3; i++;) {}
 
 |  
 
- 條件、迴圈等陳述式中小括號的後方 
不需要補分號的情境
懂了 ASI 之後
在知道 Automatic Semicolon Insertion 後應該要瞭解到結尾分號是一種選項,因此團隊風格可以決定要不要採用;另外一定要的情況是採用了不支援沒分號的壓縮工具,但現在大部分的工具應該都有支援沒分號的寫法。更重要的是絕對不會是為了減少程式碼的大小而不寫,因為最後壓縮工具都會幫你補上去。