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