日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

关于JavaScript语句后面的分号

發布時間:2025/3/21 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于JavaScript语句后面的分号 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

身為一個分號黨,我就不在嘮叨自己的看法了,為了讓我們的討論更有價值,我挖掘出來一些材料跟各位分享。


?JavaScript自動加分號規則,有3條

  • 當有換行符(包括含有換行符的多行注釋),并且下一個token沒法跟前面的語法匹配時,會自動補分號。
  • 當有}時,如果缺少分號,會補分號
  • 當程序源代碼結束時,如果缺少分號,會補分號。
  • ?

    利用我自己的JS語法分析工具JSinJS(https://github.com/kissjs/JSinJS?),我求出了所有能夠出現在語句第一個的JS語法標記 (就是Statement的first集合),他們是:

    ["debugger", "try", "throw", "switch", "Identifier", "with", "return", "break", "continue", "for", "while", "do", "if", "new", "function", "(", "{", "[", "RegularExpressionLiteral", "StringLiteral", "NumericLiteral", "BooleanLiteral", "NullLiteral", "this", "!", "~", "-", "+", "--", "++", "typeof", "void", "delete", ";", "var"]

    共計35個。

    ?

    我又求出了所有可以出現在分號之前的語法標記(即去掉分號以后的last集),他們是

    ["--", "++", "IdentifierName", "]", ")", "}", "RegularExpressionLiteral", "StringLiteral", "NumericLiteral", "BooleanLiteral", "NullLiteral", "Identifier", "this", "debugger", "return", "break", "continue"]

    共計17個。?

    ?

    35*17 = 595種組合,為了方便記憶,以下我分組來討論語法歧義 。(本來用Excel弄了張表,不過表太大了不好貼出來)

    ?

    首先,以下語法標記開頭的語句是絕對安全的,不會跟不加分號的上一行產生任何歧義:

    var if do while for continue break return with switch throw try debugger ;


    接下來我們來分組看不加分號導致的語法歧義:

    • 第一種是++和--兩種運算符出現在上一行結尾的情況,下一行以以下開頭時,會產生語法歧義:??
      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、break、continue、后自增、后自減五種語句中,換行符可以完全替代分號的作用。
  • var if do while for continue break return with switch throw try debugger幾種關鍵字開頭的語句,以及空語句,上一行加不加分號影響不大。?
  • 凡表達式語句和函數表達式語句,后面不加分號非常危險,情況極其復雜。
  • 凡(和[開頭的語句,前面不加分號極度危險。
  • ?

    以上是我整理的規則,不包含任何主觀論斷。加不加分號,終究還是各位看官自己決定。?

    練習題:

    說出以下語句自動加分號正確的位置:

    a + b a ++ b this.a = o.a /[0-9]*/g.match(string) function f() {return /* */ x } (function f1(){})() (function f2(){})() obj. if(a)/3/g .test(str) this.call() [1,2,3].forEach(function(e){console.log(e); }) from: http://www.cnblogs.com/winter-cn/archive/2012/06/20/2556431.html

    總結

    以上是生活随笔為你收集整理的关于JavaScript语句后面的分号的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。