自動分號補齊(auto semicolon insertion统屈,簡稱ASI)
在JavaScript中,行尾的分號有一種自動插入機制,如果新起了一行,并且這新的一行不能追加到當前語句時氏涩,會自動追加一個分號。但如果不加區(qū)分在每個表達式(Expression)和語句(statement)之后都手動輸入分號堪旧,那么其中絕大部分的分號是無用的削葱。
導致上下文解析出錯時需要分號
會造成此類問題的token有6個:括號,方括號淳梦,正則開頭的斜杠,加號昔字,減號爆袍,字符串模板的反引號首繁。當以這6個字符作為一行開頭時,不會在上一行自動補全分號陨囊,造成解析出錯弦疮。
a = b
(c + d).toString()
會被解析成
a = b(c + d).toString()
即()會被看做是在調用函數(shù)b,和本意不符蜘醋。所以應盡量避免以這6個字符作為一行的開頭胁塞,如果避免不了,可以選擇在行首加分號压语。
絕對禁止的行結束符(restricted productions)
如果在不該換行的地方換行了啸罢,就會自動插入一個分號。
后綴表達式
左值表達式 [無行終結符] ++
左值表達式 [無行終結符] --
Continue 語句
continue [無行終結符] 標識符? ;
Break 語句
break [無行終結符] 標識符? ;
Return 語句
return [無行終結符] 表達式? ;
Throw 語句
throw [無行終結符] 表達式? ;
[無行終結符] 代表此處禁止換行胎食。對于后綴表達式扰才,遵循的原則是避免修改上一行的值。 對于 continue, break, return 和 throw厕怜,遵循的原則是:如果他們不帶參數(shù)衩匣,他們不會指向下一行(會被插入一個分號)。
a
++
b
會被解析成
a;
++b
關于return 和 throw
function test() {
return
3
}
test()
輸出的結果實際是 undefined粥航,因為上述代碼被解析成
function test() {
return;
3
}
test()
關于break 和 continue
var num = 0
outermost:
for(let i = 0, j; i < 100; i++) {
for(j = 0; j < 100; j++) {
if(i === 50 && j===50 ) {
break
outermost
}
num++
}
}
console.log(num)
此時break 和label標示符之間有一個換行符琅捏,此時會在break后自動補分號,outermost未起作用递雀,輸出的結果為95午绳。當break 和 label標示符放在同一行即 break outermost時,輸出結果為55映之。
因此筆者建議要有良好的編碼習慣拦焚,弄清ASI的規(guī)則,分號只加在必要的地方即可杠输。