作者:尤雨溪
鏈接:https://www.zhihu.com/question/20298345/answer/49551142
來源:知乎
著作權歸作者所有,轉載請聯系作者獲得授權。
沒有應該不應該,只有你自己喜歡不喜歡。JavaScript 語法長得 C-like 不代表它本質上和 C 是一類語言,所有直覺性的 “當然應該加分號” 都是保守的、未經深入思考的草率結論。后來新設計的語言里可選分號的多得去了,光是 “可以加分號但是大家都不加” 的語言就有:Go, Scala, Ruby, Python, Swift, Groovy...
至於說 “很難總結什么時候加不加”,其實真的很簡單。真正會導致上下行解析出問題的 token 有 5 個: 括號(),方括號[],正則開頭的斜杠/,加號+,減號-。我還從沒見過實際代碼中用正則、加號、減號作為行首的情況,所以總結下來就是一句話: 一行開頭是括號或者方括號的時候加上分號就可以了,其他時候全部不需要。其實即使是這兩種情況,在實際代碼中也頗為少見。
另外,restricted production 這個東西(也就是導致 return 后面換行會自動插入分號的機制),不管你加不加分號你都是得搞懂了才能不被坑的,和加不加分號沒有什么關系。
更多細節,可以看我曾經給過的一個 talk: Hacking Semicolons by Evan You
最后,上點代碼好了,Vue.js 的代碼全部不帶分號: yyx990803/vue · GitHub
另外說到工具,我確實寫了一個,全自動幫你批量添加或者刪除分號: yyx990803/semi · GitHub 做成 Git pre-commit hook,選擇你自己喜歡的風格就可以。
至於說 “很難總結什么時候加不加”,其實真的很簡單。真正會導致上下行解析出問題的 token 有 5 個: 括號(),方括號[],正則開頭的斜杠/,加號+,減號-。我還從沒見過實際代碼中用正則、加號、減號作為行首的情況,所以總結下來就是一句話: 一行開頭是括號或者方括號的時候加上分號就可以了,其他時候全部不需要。其實即使是這兩種情況,在實際代碼中也頗為少見。
另外,restricted production 這個東西(也就是導致 return 后面換行會自動插入分號的機制),不管你加不加分號你都是得搞懂了才能不被坑的,和加不加分號沒有什么關系。
更多細節,可以看我曾經給過的一個 talk: Hacking Semicolons by Evan You
最后,上點代碼好了,Vue.js 的代碼全部不帶分號: yyx990803/vue · GitHub
另外說到工具,我確實寫了一個,全自動幫你批量添加或者刪除分號: yyx990803/semi · GitHub 做成 Git pre-commit hook,選擇你自己喜歡的風格就可以。
總結:
1. 自己書寫代碼的時候: 一條完整的語句加分號, 函數聲明不加分號
// 1. 加分號的語句 var jason = "zeng"; var eason = function () { // 其他語句... }; (function($) { // 其他語句 ... })(jQuery); ++a; b++; // 2. 不加分號的聲明 function myfunction() { // 其他語句 ... }
2. 結合別人代碼的時候: 發現他人有不加分號的特點的時候, 自己在在語句前面加分號
;(function($) { // 其他語句 ... })(jQuery); ;++a;
3. return 不能單獨占一行
var g1 = function () { return "test"; } var g2 = function () { return { a: 1, b: 2 } } var g3 = function () { return [ "one", "two" ]; }