JavaScript自動分號補齊的坑

自動分號補齊(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ī)則,分號只加在必要的地方即可杠输。

參考文章

尤雨溪在知乎的回答
JavaScript 中的自動分號插入(ASI) : 迷渡

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末赎败,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蠢甲,更是在濱河造成了極大的恐慌僵刮,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鹦牛,死亡現(xiàn)場離奇詭異搞糕,居然都是意外死亡,警方通過查閱死者的電腦和手機曼追,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門窍仰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人礼殊,你說我怎么就攤上這事驹吮≌胧罚” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵碟狞,是天一觀的道長啄枕。 經(jīng)常有香客問我,道長族沃,這世上最難降的妖魔是什么频祝? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮脆淹,結果婚禮上常空,老公的妹妹穿的比我還像新娘。我一直安慰自己未辆,他們只是感情好窟绷,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著咐柜,像睡著了一般兼蜈。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拙友,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天为狸,我揣著相機與錄音,去河邊找鬼遗契。 笑死辐棒,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的牍蜂。 我是一名探鬼主播漾根,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鲫竞!你這毒婦竟也來了辐怕?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤从绘,失蹤者是張志新(化名)和其女友劉穎寄疏,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體僵井,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡陕截,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了批什。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片农曲。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖渊季,靈堂內(nèi)的尸體忽然破棺而出朋蔫,到底是詐尸還是另有隱情罚渐,我是刑警寧澤却汉,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布驯妄,位于F島的核電站,受9級特大地震影響合砂,放射性物質發(fā)生泄漏青扔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一翩伪、第九天 我趴在偏房一處隱蔽的房頂上張望微猖。 院中可真熱鬧,春花似錦缘屹、人聲如沸凛剥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽犁珠。三九已至,卻和暖如春互亮,著一層夾襖步出監(jiān)牢的瞬間犁享,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工豹休, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留炊昆,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓威根,卻偏偏與公主長得像凤巨,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子洛搀,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 本文純屬原創(chuàng)? 如有雷同? 純屬抄襲? 不甚榮幸! 歡迎轉載敢茁! 原文收錄在【我的GitHub博客】,覺得本文...
    微醺歲月閱讀 2,049評論 2 11
  • 特別說明姥卢,為便于查閱卷要,文章轉自https://github.com/getify/You-Dont-Know-JS...
    殺破狼real閱讀 455評論 0 0
  • 前端07班 王語句JavaScript程序的執(zhí)行單位為行(line),也就是一行一行地執(zhí)行独榴。一般情況下僧叉,每一行就是...
    ea203453e188閱讀 880評論 0 4
  • 語句 JavaScript程序的執(zhí)行單位為行(line),也就是一行一行地執(zhí)行棺榔。一般情況下瓶堕,每一行就是一個語句。 ...
    米塔塔閱讀 452評論 1 10
  • 孫悟空這個家喻戶曉的傳說人物曾經(jīng)是孩子們的最愛症歇,現(xiàn)在是英雄主義的心頭好郎笆。 名著中的主角們似乎有著取之不盡的資源等待...
    愛烏及吾閱讀 729評論 0 0