JavaScript 提供了 automatic semicolon insertion (ASI)自動插入分號規(guī)則,在不加分號的情況下,會自動補充分號來分隔不同語句。
導致在繼左大括號換行、tab 和 space 圣戰(zhàn)后,前端又出現了一場戰(zhàn)爭。
并且隨著那個男人加入這場討論之后,關于是否應該加分號的討論更是激烈了。
ASI 自動插入分號規(guī)則
在決定是否添加分號之前,我們先來了解一下編譯器到底在哪些情況下會自動插入分號,哪些情況必須手動添加分號。
會自動添加分號的情況
1.遇到換行符,但是兩句代碼連接是無效代碼
// 代碼
42
'hello'
// `42 'hello'`連接在一起是無效語句,所以會自動在之間插入分號
42;'hello'
// 直接明確的寫法
42;"hello"
// 代碼
let a = 10, b = 5
a
-
b
// a - b 為有效代碼,所以三者之間不會自動加分號
a = 1; b = 2;
// 直接明確的寫法
a - b
2.遇到換行符,但是兩句代碼之間不允許有換行符
// 代碼
foo
++
bar
++
baz
// foo 和 ++ 符合規(guī)則1,但是不符合 no LineTerminator here規(guī)則,所以會添加分號
foo;
++bar;
++baz;
在 JS 標準中,有個 no LineTerminator here 的規(guī)則,規(guī)定哪些語法不能加入換行符,如果開發(fā)者加了換行符,則 JS 編譯器會無法識別并加入分號。
- 帶標簽的
continue
語句,不能continue
后插入換行; - 帶標簽的
break
語句,不能在break
后面插入換行; -
return
后面不能插入換行; - 后自增、后自減運算符前不能插入換行;
-
throw
和Exception
之間不能插入換行; -
async
關鍵字,后面不能插入換行; - 箭頭函數的箭頭前,不能插入換行;
-
yield
之后,不能插入換行。
3.Restricted productions
如果這些標簽后,空一行書寫其它語句,則會自動在這些標簽后添加分號:
-
++
?or?--
return
break
continue
- ES6
yield
、async
等 - 反引號`
// return 后空一行再書寫語句,則會自動在 return 后加分號
return
{
a: 1
}
// 這是正確寫法
return {
a: 1
}
其它標簽類似。
如果手動在這些標簽后加上分號,同樣也是錯誤的,比如:
// 空一行再寫 a,會自動在 ++ 后添加分號
++
a
// 就算手動添加,和上面結果一樣是錯誤的
++;
a;
所以針對 Restricted productions ,無論讓編譯器自動添加分號,還是自己手動加上分號,都是錯誤的,都應該去避免去換行,避免寫這種寫法。
必須手動加分號的情況
以下面這些標簽開頭的命令,必須在前面加分號,和前面一個語句分隔:
-
+
和-
:語句以 + 或者 - 開頭 -
/
: 語句以正則表達式開頭 -
(
: 語句以自執(zhí)行函數開頭 -
[
: 語句以數組開頭
舉例說明:
// 錯誤
a = b
+a
// 正確
a = b
;+a
// 錯誤
a = b
/something/.test(a)
// 正確
a = b
;/something/.test(a)
// 錯誤
a = b
(function () {})()
// 正確
a = b
;(function() {})()
// 錯誤
a = b
[1, 2, 3].forEach()
// 正確
a = b
;[1, 2, 3].forEach()
上面的情況,如果第二行代碼不手動添加分號的話,兩行代碼會合并在一起導致結果錯誤或者報錯。
上面幾種情況中,只有自執(zhí)行函數和數組開頭會在極少情況下遇到,記住這兩個前面要手動加上分號即可。
就算是習慣加分號的朋友,但仍然要注意下面的情況:
// 不需要結尾添加分號
if () {
}
// 不需要結尾添加分號
for () {
}
// 不需要結尾添加分號
while () {
}
// 需要在結尾添加分號
var a = function () {
};
// 需要在結尾添加分號
var a = {
prop: value
};
// 報錯
[1, 2, 3].forEach();
即便習慣寫分號的朋友,也很少有人在 if
、for
、while
等語句 }
后寫分號,但是如果使用賦值的形式傳遞,則一定要注意在 }
把分號添加上,以避免后面語句出現自執(zhí)行和數組開頭的語句。
推薦遇到自執(zhí)行和數組開頭的,直接前面加上分號就完事了。
總結
是否添加和是否手動加是兩回事,我們可以用 eslint、Prettier 等工具自動生成或者刪除分號,是否手動加可以看個人喜好,最終代碼內可以根據項目要求用工具生成。文章來源:http://www.zghlxwxcb.cn/news/detail-801440.html
但都要注意必須添加分號的幾種情況。文章來源地址http://www.zghlxwxcb.cn/news/detail-801440.html
參考文章
- Hacking Semicolons
- What are the rules for JavaScript's automatic semicolon insertion (ASI)? - Stack Overflow
到了這里,關于JavaScript到底應不應該加分號?JavaScript自動插入分號規(guī)則詳解的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!