日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

关于JavaScript语句后面的分号

發(fā)布時(shí)間:2025/3/21 javascript 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于JavaScript语句后面的分号 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

身為一個(gè)分號(hào)黨,我就不在嘮叨自己的看法了,為了讓我們的討論更有價(jià)值,我挖掘出來(lái)一些材料跟各位分享。


?JavaScript自動(dòng)加分號(hào)規(guī)則,有3條

  • 當(dāng)有換行符(包括含有換行符的多行注釋),并且下一個(gè)token沒(méi)法跟前面的語(yǔ)法匹配時(shí),會(huì)自動(dòng)補(bǔ)分號(hào)。
  • 當(dāng)有}時(shí),如果缺少分號(hào),會(huì)補(bǔ)分號(hào)
  • 當(dāng)程序源代碼結(jié)束時(shí),如果缺少分號(hào),會(huì)補(bǔ)分號(hào)。
  • ?

    利用我自己的JS語(yǔ)法分析工具JSinJS(https://github.com/kissjs/JSinJS?),我求出了所有能夠出現(xiàn)在語(yǔ)句第一個(gè)的JS語(yǔ)法標(biāo)記 (就是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"]

    共計(jì)35個(gè)。

    ?

    我又求出了所有可以出現(xiàn)在分號(hào)之前的語(yǔ)法標(biāo)記(即去掉分號(hào)以后的last集),他們是

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

    共計(jì)17個(gè)。?

    ?

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

    ?

    首先,以下語(yǔ)法標(biāo)記開(kāi)頭的語(yǔ)句是絕對(duì)安全的,不會(huì)跟不加分號(hào)的上一行產(chǎn)生任何歧義:

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


    接下來(lái)我們來(lái)分組看不加分號(hào)導(dǎo)致的語(yǔ)法歧義:

    • 第一種是++和--兩種運(yùn)算符出現(xiàn)在上一行結(jié)尾的情況,下一行以以下開(kāi)頭時(shí),會(huì)產(chǎn)生語(yǔ)法歧義:??
      function?delete?void typeof new null true false NumericLiteral StringLiteral RegularExpressionLiteral ( [?{?Identifier ++ -- + - ~ !??
      其中,function和delete是非常常用的statement開(kāi)頭。?
      特別是 ++和--單獨(dú)被斷為一行的時(shí)候,因?yàn)镴S的語(yǔ)法規(guī)則規(guī)定后自增運(yùn)算不允許中間插入換行,所以++和--會(huì)被視為前自增而跟下一行連接在一起。
    • 第二種是return作為上一行結(jié)尾的情況,下一行以以下開(kāi)頭時(shí),會(huì)產(chǎn)生語(yǔ)法歧義:?
      function?delete void?typeof?(?[?{?Identifier?++?--?+?-?~?! 同樣因?yàn)镴S語(yǔ)法的規(guī)則不允許在return 和后面的值之間插入換行,所以return之后只要有換行符就會(huì)視為有分號(hào),這常常會(huì)與使用者的期望不符合。
    • 第三種是下一行以+和-開(kāi)頭的情況,上一行以以下結(jié)尾是,會(huì)產(chǎn)生語(yǔ)法歧義:?
      --?++?IdentifierName?]?)?} RegularExpressionLiteral

      因?yàn)楹苌儆姓Z(yǔ)句以+或者-開(kāi)頭,所以這種情況不算危險(xiǎn)。

    • 第四種是上一行以break、continue結(jié)尾的情況,下一行以Identifier開(kāi)頭時(shí),會(huì)產(chǎn)生語(yǔ)法歧義。
    • 第五種是下一行以(和[開(kāi)頭的情況,上一行以以下結(jié)尾是,會(huì)產(chǎn)生語(yǔ)法歧義:?
      -- ++ IdentifierName ] ) } RegularExpressionLiteral StringLiteral NumericLiteral BooleanLiteral NullLiteral Identifier this??
      這種情況非常危險(xiǎn)(所以hax的文章中要提出這種情況應(yīng)該語(yǔ)句前寫(xiě)分號(hào)),幾乎上一行的所有情況都將導(dǎo)致正常期望之外的結(jié)果。?
    • 第六種是,當(dāng)下一行以RegularExpressionLiteral 開(kāi)頭的情況,上一行的以下結(jié)尾,會(huì)導(dǎo)致/被理解為除號(hào):?
      -- ++ IdentifierName ] ) }? RegularExpressionLiteral StringLiteral NumericLiteral BooleanLiteral NullLiteral Identifier this?

    總結(jié),

    ?

  • 在return、break、continue、后自增、后自減五種語(yǔ)句中,換行符可以完全替代分號(hào)的作用。
  • var if do while for continue break return with switch throw try debugger幾種關(guān)鍵字開(kāi)頭的語(yǔ)句,以及空語(yǔ)句,上一行加不加分號(hào)影響不大。?
  • 凡表達(dá)式語(yǔ)句和函數(shù)表達(dá)式語(yǔ)句,后面不加分號(hào)非常危險(xiǎn),情況極其復(fù)雜。
  • 凡(和[開(kāi)頭的語(yǔ)句,前面不加分號(hào)極度危險(xiǎn)。
  • ?

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

    練習(xí)題:

    說(shuō)出以下語(yǔ)句自動(dòng)加分號(hào)正確的位置:

    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

    總結(jié)

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

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。