摘要:自動(dòng)填補(bǔ)分號(hào)的規(guī)則在說(shuō)要不要寫(xiě)分號(hào)之前,先了解一下自動(dòng)填補(bǔ)分號(hào)的規(guī)則。后來(lái)看到知乎上的作者尤雨溪和前端大神賀師俊的回答后,我對(duì)寫(xiě)分號(hào)的想法完全顛覆了。總是寫(xiě)分號(hào)并不能完全解決缺陷如后換行會(huì)自動(dòng)插入分號(hào)。
在打算寫(xiě)這篇文章之前,我是一個(gè)分號(hào)黨,在寫(xiě)這篇文章之后,可能會(huì)轉(zhuǎn)為無(wú)分號(hào)黨了。之前是寫(xiě)分號(hào)是編輯器語(yǔ)法較檢所養(yǎng)成的強(qiáng)迫癥,現(xiàn)在觀念的轉(zhuǎn)變,是因?yàn)榭戳瞬簧俅笊竦挠懻摵?,覺(jué)得javascript語(yǔ)句后寫(xiě)分號(hào)除了增大工作量外,意義不大。
javascript自動(dòng)填補(bǔ)分號(hào)的規(guī)則在說(shuō)要不要寫(xiě)分號(hào)之前,先了解一下javascript自動(dòng)填補(bǔ)分號(hào)的規(guī)則。
在《javascript權(quán)威指南》中有一段話“如果一條語(yǔ)句以“(”、“[”、“/”、“+”、或“-”開(kāi)始,那么它極有可能和前一條語(yǔ)句合在一起解釋。”,寫(xiě)javascript的時(shí)候,如果每條語(yǔ)句都獨(dú)自寫(xiě)成一行,是不需要寫(xiě)分號(hào)的,但是下一行如果遇到上面提到的符號(hào),javascript可能會(huì)與下一行合并解釋。其中以“/”、“+”和“-”開(kāi)頭的語(yǔ)句在實(shí)現(xiàn)項(xiàng)目中比較少見(jiàn),以“(”和“[”開(kāi)頭的則非常常見(jiàn)。下面各找了一個(gè)例子來(lái)說(shuō)明。
以“(”開(kāi)頭的情況:a = b (function() { })()
javascript會(huì)解釋成:
a = b(function() { })();以“[”開(kāi)頭的情況
a = function() { } [1,2,3].forEach(function(item) { });
javascript會(huì)解釋成:
a = function() { }[1,2,3].forEach(function(item) { });以“/”開(kāi)頭的情況
a = "abc" /[a-z]/.test(a)
期望的結(jié)果為true,但是javascript會(huì)解釋成,接著就報(bào)錯(cuò)了:
a = ‘a(chǎn)bc’/[a-z]/.test(a);以“+”開(kāi)頭的情況
a = b +c
javascript會(huì)解釋成
a = b + c;以“-”開(kāi)頭的情況
a = b -c
javascript會(huì)解釋成
a = b - c;
如果在return、break、continue、throw等關(guān)鍵字后面換行,javascript會(huì)在換行處填補(bǔ)分號(hào)。如:
return { a: 1 }
會(huì)解釋成:
return; { a: 1 }
如果“++”或“--”運(yùn)算符作為表達(dá)式的后綴時(shí),表達(dá)式應(yīng)該寫(xiě)在同一行,否則也會(huì)解釋有誤
例如:
x ++ y
會(huì)解釋成:
x; ++y;
而不是
x++; y;要不要寫(xiě)分號(hào)
對(duì)于究竟要不要寫(xiě)分號(hào)這個(gè)問(wèn)題,我之前也沒(méi)有細(xì)想,看到編輯器有提示就寫(xiě)了,也沒(méi)有想過(guò)寫(xiě)與不寫(xiě)有什么區(qū)別,甚至在寫(xiě)這篇文章時(shí),思路還是要將寫(xiě)分號(hào)當(dāng)作團(tuán)隊(duì)代碼的規(guī)范。后來(lái)看到知乎上vuejs的作者尤雨溪和前端大神賀師俊的回答后,我對(duì)寫(xiě)分號(hào)的想法完全顛覆了。
對(duì)于總是寫(xiě)分號(hào)的缺陷,賀思俊的總結(jié)很到位,他總結(jié)的3點(diǎn)缺陷如下:
人總是有可能忘記寫(xiě)分號(hào)。ASI(分號(hào)自動(dòng)插入機(jī)制)導(dǎo)致無(wú)法區(qū)分是無(wú)意中忘記還是有意不寫(xiě)(代碼折行)。
“總是寫(xiě)分號(hào)”并不能完全解決ASI缺陷(如return后換行會(huì)自動(dòng)插入分號(hào))。
“}”后是否要加分號(hào)需要回溯到對(duì)應(yīng)“{”之前進(jìn)行語(yǔ)義判斷(是否是函數(shù)表達(dá)式),成本遠(yuǎn)高于前置分號(hào)判斷(只要對(duì)行首字符進(jìn)行token判斷:是否是 [ ( + - / 五個(gè)符號(hào)之一)。
而對(duì)于上面提到的五種符號(hào)需要加分號(hào)的情況,完成可以用工具來(lái)幫我們自動(dòng)完成,現(xiàn)在看來(lái)寫(xiě)分號(hào)除了滿足強(qiáng)迫癥外,好像真的沒(méi)有什么必要了
參考資料《javascript權(quán)威指南》 第30-31頁(yè)
尤雨溪對(duì)于javascript語(yǔ)句后要不要寫(xiě)分號(hào)的回答
賀思俊對(duì)于javascript語(yǔ)句后要不要寫(xiě)分號(hào)的回答
Hacking Semicolons
JavaScript 中的“自動(dòng)分號(hào)插入”機(jī)制(ASI)
近期在看《javascript權(quán)威指南》,邊看邊總結(jié),都會(huì)同步發(fā)送到微信公眾號(hào)上,歡迎關(guān)注,歡迎提意見(jiàn):
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/92356.html
摘要:構(gòu)造函數(shù)很多教程都告訴我們,不要直接用內(nèi)置對(duì)象的構(gòu)造函數(shù)來(lái)創(chuàng)建基本變量,例如的寫(xiě)法就應(yīng)該用的寫(xiě)法來(lái)取代。但是,構(gòu)造函數(shù)注意是大寫(xiě)的有點(diǎn)特別。構(gòu)造函數(shù)接受的參數(shù)中,第一個(gè)是要傳入的參數(shù)名,第二個(gè)是函數(shù)內(nèi)的代碼用字符串來(lái)表示。 如何寫(xiě)JavaScript才能逼格更高呢?怎樣才能組織JavaScript才能讓別人一眼看出你不簡(jiǎn)單呢?是否很期待別人在看完你的代碼之后感嘆一句原來(lái)還可以這樣寫(xiě)呢?...
摘要:從到使用開(kāi)發(fā)實(shí)戰(zhàn)六這是一個(gè)有代碼潔癖的項(xiàng)目一個(gè)小故事一天我路過(guò)一座橋,碰巧看見(jiàn)一個(gè)人想跳河自殺。配置什么是是一個(gè)開(kāi)源的代碼檢查工具,由于年月創(chuàng)建。使用編寫(xiě),這樣既可以有一個(gè)快速的運(yùn)行環(huán)境的同時(shí)也便于安裝。 從0到1使用VUE-CLI3開(kāi)發(fā)實(shí)戰(zhàn)(六):這是一個(gè)有代碼潔癖的項(xiàng)目 一個(gè)小故事 一天我路過(guò)一座橋,碰巧看見(jiàn)一個(gè)人想跳河自殺。我跑過(guò)去對(duì)他大喊道:別跳,別死啊。為什么不讓我跳?他說(shuō)。...
摘要:一自動(dòng)插入分號(hào)規(guī)則三條規(guī)則要有換行符,且下一個(gè)符號(hào)是不符合語(yǔ)法的,那么就嘗試插入分號(hào)。有換行符,且語(yǔ)法中規(guī)定此處不能有換行符,那么就自動(dòng)插入分號(hào)。源代碼結(jié)束處,不能形成完整的腳本或者模塊結(jié)構(gòu),那么就自動(dòng)插入分號(hào)。 筆記說(shuō)明 重學(xué)前端是程劭非(winter)【前手機(jī)淘寶前端負(fù)責(zé)人】在極客時(shí)間開(kāi)的一個(gè)專(zhuān)欄,每天10分鐘,重構(gòu)你的前端知識(shí)體系,筆者主要整理學(xué)習(xí)過(guò)程的一些要點(diǎn)筆記以及感悟,完整...
摘要:一自動(dòng)插入分號(hào)規(guī)則三條規(guī)則要有換行符,且下一個(gè)符號(hào)是不符合語(yǔ)法的,那么就嘗試插入分號(hào)。有換行符,且語(yǔ)法中規(guī)定此處不能有換行符,那么就自動(dòng)插入分號(hào)。源代碼結(jié)束處,不能形成完整的腳本或者模塊結(jié)構(gòu),那么就自動(dòng)插入分號(hào)。 筆記說(shuō)明 重學(xué)前端是程劭非(winter)【前手機(jī)淘寶前端負(fù)責(zé)人】在極客時(shí)間開(kāi)的一個(gè)專(zhuān)欄,每天10分鐘,重構(gòu)你的前端知識(shí)體系,筆者主要整理學(xué)習(xí)過(guò)程的一些要點(diǎn)筆記以及感悟,完整...
閱讀 3092·2023-04-26 00:53
閱讀 3543·2021-11-19 09:58
閱讀 1705·2021-09-29 09:35
閱讀 3293·2021-09-28 09:46
閱讀 3873·2021-09-22 15:38
閱讀 2700·2019-08-30 15:55
閱讀 3020·2019-08-23 14:10
閱讀 3835·2019-08-22 18:17