国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

關于JavaScript語句后面的分號問題

2024-05-06 15:23:44
字體:
來源:轉載
供稿:網友

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
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 云浮市| 建昌县| 文昌市| 柏乡县| 新干县| 阿鲁科尔沁旗| 嵊州市| 耿马| 永济市| 大邑县| 佛坪县| 汉阴县| 绥德县| 栖霞市| 沛县| 河曲县| 海晏县| 延川县| 桦南县| 聂拉木县| 柘城县| 香港| 清原| 福贡县| 寿光市| 沂水县| 平昌县| 青神县| 富顺县| 安陆市| 石柱| 托克逊县| 新乡县| 法库县| 龙陵县| 五大连池市| 鲁甸县| 资阳市| 沅江市| 儋州市| 临朐县|