身為一個分號黨,我就不在嘮叨自己的看法了,為了讓我們的討論更有價值,我挖掘出來一些材料跟各位分享。
JavaScript自動加分號規則,有3條
- 當有分行符號(包括含有分行符號的多行注釋),並且下一個token沒法跟前面的文法匹配時,會自動補分號。
- 當有}時,如果缺少分號,會補分號
- 當程式原始碼結束時,如果缺少分號,會補分號。
利用我自己的JS文法分析工具JSinJS(https://github.com/kissjs/JSinJS ),我求出了所有能夠出現在語句第一個的JS文法標記 (就是Statement的first集合),他們是:
["debugger", "try", "throw", "switch", "Identifier", "with", "return", "break", "continue", "for", "while", "do", "if", "new", "function", "(", "{", "[", "RegularExpressionLiteral", "StringLiteral", "NumericLiteral", "BooleanLiteral", "NullLiteral", "this", "!", "~", "-", "+", "--", "++", "typeof", "void", "delete", ";", "var"]
共計35個。
我又求出了所有可以出現在分號之前的文法標記(即去掉分號以後的last集),他們是
["--", "++", "IdentifierName", "]", ")", "}", "RegularExpressionLiteral", "StringLiteral", "NumericLiteral", "BooleanLiteral", "NullLiteral", "Identifier", "this", "debugger", "return", "break", "continue"]
共計17個。
35*17 = 595種組合,為了方便記憶,以下我分組來討論文法歧義 。(本來用Excel弄了張表,不過表太大了不好貼出來)
首先,以下文法標記開頭的語句是絕對安全的,不會跟不加分號的上一行產生任何歧義:
var if do while for continue break return with switch throw try debugger ;
接下來我們來分組看不加分號導致的文法歧義:
總結,
- 在return、break、continue、後自增、後自減五種語句中,分行符號可以完全替代分號的作用。
- var if do while for continue break return with switch throw try debugger幾種關鍵字開頭的語句,以及空語句,上一行加不加分號影響不大。
- 凡運算式語句和函數運算式語句,後面不加分號非常危險,情況極其複雜。
- 凡(和[開頭的語句,前面不加分號極度危險。
以上是我整理的規則,不包含任何主觀論斷。加不加分號,終究還是各位看官自己決定。
練習題:
說出以下語句自動加分號正確的位置:
a+b
a++ b
this.a = o.a/[0-9]*/g.match(string)
function f() { return /* */ x }
(function f1(){})()(function f2(){})()
obj.if(a)/3/g .test(str)
this.call()[1,2,3].forEach(function(e){ console.log(e); })