javascript每條語句都是以分號結束,但由於javascript具有分號自動插入規則,所有不同的編程人員有不同的習慣,有的加分號,有的不加分號,那麼到底加分號好還是不加分號好?本文章向大家探討javascript每條語句該不該加分號。
javascript的分號代表語句的結束符,但由於javascript具有分號自動插入規則,所以它是一個十分容易讓人模糊的東西,在一般情況下,一個換行就會產生一個分號,但實際情況卻不然,也就是說在javascript中換行可能產生分號,也可能不產生,是否自動插入分號,主要看上下行。所以即使是經驗豐富的程序員,有時候也會頭大。
JavaScript自動加分號規則:
接下來我們來分組看不加分號導致的語法歧義:
第一種是++和--兩種運算符出現在上一行結尾的情況,下一行以以下開頭時,會產生語法歧義:
function delete void typeof new null true false NumericLiteral StringLiteral RegularExpressionLiteral ( [ { Identifier ++ -- + - ~ !
其中,function和delete是非常常用的statement開頭。
特別是 ++和--單獨被斷為一行的時候,因為JS的語法規則規定後自增運算不允許中間插入換行,所以++和--會被視為前自增而跟下一行連接在一起。
第二種是return作為上一行結尾的情況,下一行以以下開頭時,會產生語法歧義:
function delete void typeof ( [ { Identifier ++ -- + - ~ !
同樣因為JS語法的規則不允許在return 和後面的值之間插入換行,所以return之後只要有換行符就會視為有分號,這常常會與使用者的期望不符合。
第三種是下一行以+和-開頭的情況,上一行以以下結尾是,會產生語法歧義:
-- ++ IdentifierName ] ) } RegularExpressionLiteral
因為很少有語句以+或者-開頭,所以這種情況不算危險。
第四種是上一行以break、continue結尾的情況,下一行以Identifier開頭時,會產生語法歧義。
第五種是下一行以(和[開頭的情況,上一行以以下結尾是,會產生語法歧義:
-- ++ IdentifierName ] ) } RegularExpressionLiteral StringLiteral NumericLiteral BooleanLiteral NullLiteral Identifier this
這種情況非常危險(所以hax的文章中要提出這種情況應該語句前寫分號),幾乎上一行的所有情況都將導致正常期望之外的結果。
第六種是,當下一行以RegularExpressionLiteral 開頭的情況,上一行的以下結尾,會導致/被理解為除號:
-- ++ IdentifierName ] ) } RegularExpressionLiteral StringLiteral NumericLiteral BooleanLiteral NullLiteral Identifier this
實踐出真理,看一下下面這些例子,就明白,分號自動插入不是那麼好讓人捉摸的。稍微不注意就會讓你頭大。
return引起的血案:
function test(){ var a = 1; var b = 2; return //會自動插入分號 ( a+b ) }; alert(test());
一個返回a+b值的函數,初看沒任何問題,但運行alert的結果卻是undefined。根據分號的自動插入規則,return 語句後面如果有換行就會自動插入分號,沒有返回值也就比較好理解了。如果需要換行的話,可以這樣:
function test(){ var a = 1; var b = 2; return ( a+b ) }; alert(test());
兩個閉包引起的血案:
(function (){ var a; })() //不會自動插入分號 (function (){ var b; })()
很詭異,解釋不了,誰能告訴我~
for語句頭中的兩個分號,不自動插入分號
for( var a=1,b=10 //不會自動插入分號 a<b //不會自動插入分號 a++ ) {}
總結
以上就是對JavaScript 分號的資料整理,後續繼續補充相關資料,謝謝大家對本站的支持!