JavaScript中自動(dòng)插入分號(hào)的規(guī)則詳解
JavaScript 提供了 automatic semicolon insertion (ASI)自動(dòng)插入分號(hào)規(guī)則,在不加分號(hào)的情況下,會(huì)自動(dòng)補(bǔ)充分號(hào)來(lái)分隔不同語(yǔ)句。
導(dǎo)致在繼左大括號(hào)換行、tab 和 space 圣戰(zhàn)后,前端又出現(xiàn)了一場(chǎng)戰(zhàn)爭(zhēng)。
并且隨著那個(gè)男人加入這場(chǎng)討論之后,關(guān)于是否應(yīng)該加分號(hào)的討論更是激烈了。

ASI 自動(dòng)插入分號(hào)規(guī)則
在決定是否添加分號(hào)之前,我們先來(lái)了解一下編譯器到底在哪些情況下會(huì)自動(dòng)插入分號(hào),哪些情況必須手動(dòng)添加分號(hào)。
會(huì)自動(dòng)添加分號(hào)的情況
1.遇到換行符,但是兩句代碼連接是無(wú)效代碼
// 代碼 42 'hello' // `42 'hello'`連接在一起是無(wú)效語(yǔ)句,所以會(huì)自動(dòng)在之間插入分號(hào) 42;'hello' // 直接明確的寫(xiě)法 42;"hello"
// 代碼 let a = 10, b = 5 a - b // a - b 為有效代碼,所以三者之間不會(huì)自動(dòng)加分號(hào) a = 1; b = 2; // 直接明確的寫(xiě)法 a - b
2.遇到換行符,但是兩句代碼之間不允許有換行符
// 代碼 foo ++ bar ++ baz // foo 和 ++ 符合規(guī)則1,但是不符合 no LineTerminator here規(guī)則,所以會(huì)添加分號(hào) foo; ++bar; ++baz;
在 JS 標(biāo)準(zhǔn)中,有個(gè) no LineTerminator here 的規(guī)則,規(guī)定哪些語(yǔ)法不能加入換行符,如果開(kāi)發(fā)者加了換行符,則 JS 編譯器會(huì)無(wú)法識(shí)別并加入分號(hào)。
- 帶標(biāo)簽的
continue語(yǔ)句,不能continue后插入換行; - 帶標(biāo)簽的
break語(yǔ)句,不能在break后面插入換行; return后面不能插入換行;- 后自增、后自減運(yùn)算符前不能插入換行;
throw和Exception之間不能插入換行;async關(guān)鍵字,后面不能插入換行;- 箭頭函數(shù)的箭頭前,不能插入換行;
yield之后,不能插入換行。
3.Restricted productions
如果這些標(biāo)簽后,空一行書(shū)寫(xiě)其它語(yǔ)句,則會(huì)自動(dòng)在這些標(biāo)簽后添加分號(hào):
++or--returnbreakcontinue- ES6
yield、async等 - 反引號(hào)`
// return 后空一行再書(shū)寫(xiě)語(yǔ)句,則會(huì)自動(dòng)在 return 后加分號(hào)
return
{
a: 1
}
// 這是正確寫(xiě)法
return {
a: 1
}
其它標(biāo)簽類似。
如果手動(dòng)在這些標(biāo)簽后加上分號(hào),同樣也是錯(cuò)誤的,比如:
// 空一行再寫(xiě) a,會(huì)自動(dòng)在 ++ 后添加分號(hào) ++ a // 就算手動(dòng)添加,和上面結(jié)果一樣是錯(cuò)誤的 ++; a;
所以針對(duì) Restricted productions ,無(wú)論讓編譯器自動(dòng)添加分號(hào),還是自己手動(dòng)加上分號(hào),都是錯(cuò)誤的,都應(yīng)該去避免去換行,避免寫(xiě)這種寫(xiě)法。
必須手動(dòng)加分號(hào)的情況
以下面這些標(biāo)簽開(kāi)頭的命令,必須在前面加分號(hào),和前面一個(gè)語(yǔ)句分隔:
+和-:語(yǔ)句以 + 或者 - 開(kāi)頭/: 語(yǔ)句以正則表達(dá)式開(kāi)頭(: 語(yǔ)句以自執(zhí)行函數(shù)開(kāi)頭[: 語(yǔ)句以數(shù)組開(kāi)頭
舉例說(shuō)明:
// 錯(cuò)誤
a = b
+a
// 正確
a = b
;+a
// 錯(cuò)誤
a = b
/something/.test(a)
// 正確
a = b
;/something/.test(a)
// 錯(cuò)誤
a = b
(function () {})()
// 正確
a = b
;(function() {})()
// 錯(cuò)誤
a = b
[1, 2, 3].forEach()
// 正確
a = b
;[1, 2, 3].forEach()
上面的情況,如果第二行代碼不手動(dòng)添加分號(hào)的話,兩行代碼會(huì)合并在一起導(dǎo)致結(jié)果錯(cuò)誤或者報(bào)錯(cuò)。
上面幾種情況中,只有自執(zhí)行函數(shù)和數(shù)組開(kāi)頭會(huì)在極少情況下遇到,記住這兩個(gè)前面要手動(dòng)加上分號(hào)即可。
就算是習(xí)慣加分號(hào)的朋友,但仍然要注意下面的情況:
// 不需要結(jié)尾添加分號(hào)
if () {
}
// 不需要結(jié)尾添加分號(hào)
for () {
}
// 不需要結(jié)尾添加分號(hào)
while () {
}
// 需要在結(jié)尾添加分號(hào)
var a = function () {
};
// 需要在結(jié)尾添加分號(hào)
var a = {
prop: value
};
// 報(bào)錯(cuò)
[1, 2, 3].forEach();
即便習(xí)慣寫(xiě)分號(hào)的朋友,也很少有人在 if 、for、while 等語(yǔ)句 } 后寫(xiě)分號(hào),但是如果使用賦值的形式傳遞,則一定要注意在 } 把分號(hào)添加上,以避免后面語(yǔ)句出現(xiàn)自執(zhí)行和數(shù)組開(kāi)頭的語(yǔ)句。
推薦遇到自執(zhí)行和數(shù)組開(kāi)頭的,直接前面加上分號(hào)就完事了。
總結(jié)
是否添加和是否手動(dòng)加是兩回事,我們可以用 eslint、Prettier 等工具自動(dòng)生成或者刪除分號(hào),是否手動(dòng)加可以看個(gè)人喜好,最終代碼內(nèi)可以根據(jù)項(xiàng)目要求用工具生成。
但都要注意必須添加分號(hào)的幾種情況。
以上就是JavaScript中自動(dòng)插入分號(hào)的規(guī)則詳解 的詳細(xì)內(nèi)容,更多關(guān)于JavaScript自動(dòng)插入分號(hào)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
JavaScript實(shí)現(xiàn)將阿拉伯?dāng)?shù)字轉(zhuǎn)換成中文或大寫(xiě)中文的方法
現(xiàn)在有需求將億元之內(nèi)的阿拉伯?dāng)?shù)字轉(zhuǎn)換成中文,例如:1234轉(zhuǎn)換后變?yōu)橐磺Ф偃脑俎D(zhuǎn)換成壹仟貳佰叁拾肆,所以本文給大家介紹了用JavaScript實(shí)現(xiàn)將阿拉伯?dāng)?shù)字轉(zhuǎn)換成中文大寫(xiě),感興趣的小伙伴跟著小編一起來(lái)看看吧2024-11-11
JS實(shí)現(xiàn)鼠標(biāo)滑過(guò)鏈接改變網(wǎng)頁(yè)背景顏色的方法
這篇文章主要介紹了JS實(shí)現(xiàn)鼠標(biāo)滑過(guò)鏈接改變網(wǎng)頁(yè)背景顏色的方法,涉及js響應(yīng)鼠標(biāo)事件動(dòng)態(tài)修改頁(yè)面元素屬性的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10
JavaScript實(shí)現(xiàn)數(shù)組去重的十種方法分享
去重是開(kāi)發(fā)中經(jīng)常會(huì)碰到的一個(gè)熱點(diǎn)問(wèn)題,這篇文章主要介紹了JavaScript中實(shí)現(xiàn)數(shù)組去重的10種方法,文中的示例代碼講解詳細(xì),感興趣的可以了解一下2022-11-11
談?wù)勎覍?duì)JavaScript原型和閉包系列理解(隨手筆記6)
這篇文章主要介紹我對(duì)JavaScript原型和閉包系列理解(隨手筆記6)的相關(guān)資料,需要的朋友可以參考下2015-12-12
Javascript 計(jì)算字符串在localStorage中所占字節(jié)數(shù)
本文給大家分享的是使用Javascript 計(jì)算字符串在localStorage中所占字節(jié)數(shù),分別對(duì)UTF-8和UTF-16兩種編碼進(jìn)行了詳細(xì)說(shuō)明,有需要的小伙伴可以參考下。2015-10-10

