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

首頁 > 編程 > JavaScript > 正文

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

2019-11-19 14:46:17
字體:
來源:轉載
供稿:網友

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

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

利用我自己的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 ;

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

  1. 第一種是++和--兩種運算符出現在上一行結尾的情況,下一行以以下開頭時,會產生語法歧義: 
  2. function delete void typeof new null true false NumericLiteral StringLiteral RegularExpressionLiteral ( [ { Identifier ++ -- + - ~ ! 
  3. 其中,function和delete是非常常用的statement開頭。
  4. 特別是 ++和--單獨被斷為一行的時候,因為JS的語法規則規定后自增運算不允許中間插入換行,所以++和--會被視為前自增而跟下一行連接在一起。
  5. 第二種是return作為上一行結尾的情況,下一行以以下開頭時,會產生語法歧義:
  6. function delete void typeof ( [ { Identifier ++ -- + - ~ !
  7. 同樣因為JS語法的規則不允許在return 和后面的值之間插入換行,所以return之后只要有換行符就會視為有分號,這常常會與使用者的期望不符合。
  8. 第三種是下一行以+和-開頭的情況,上一行以以下結尾是,會產生語法歧義:
  9. -- ++ IdentifierName ] ) } RegularExpressionLiteral
  10. 因為很少有語句以+或者-開頭,所以這種情況不算危險。
  11. 第四種是上一行以break、continue結尾的情況,下一行以Identifier開頭時,會產生語法歧義。
  12. 第五種是下一行以(和[開頭的情況,上一行以以下結尾是,會產生語法歧義:
  13. -- ++ IdentifierName ] ) } RegularExpressionLiteral StringLiteral NumericLiteral BooleanLiteral NullLiteral Identifier this 
  14. 這種情況非常危險(所以hax的文章中要提出這種情況應該語句前寫分號),幾乎上一行的所有情況都將導致正常期望之外的結果。
  15. 第六種是,當下一行以RegularExpressionLiteral 開頭的情況,上一行的以下結尾,會導致/被理解為除號:
  16. -- ++ IdentifierName ] ) }  RegularExpressionLiteral StringLiteral NumericLiteral BooleanLiteral NullLiteral Identifier this

總結,

  1. 在return、break、continue、后自增、后自減五種語句中,換行符可以完全替代分號的作用。
  2. var if do while for continue break return with switch throw try debugger幾種關鍵字開頭的語句,以及空語句,上一行加不加分號影響不大。
  3. 凡表達式語句和函數表達式語句,后面不加分號非常危險,情況極其復雜。
  4. 凡(和[開頭的語句,前面不加分號極度危險。

下面在通過實例代碼介紹下JavaScript中的分號問題

一般在比較懶的前臺程序員中經常會碰到一些莫名其妙的問題。

今天僅討論一下在JS中經常會碰到一些關于分號的問題。JavaScript這門語言是可以省略分號的,是因為它會換行符后如果缺少分號就會無法編譯時它會默認添加上分號,但是在一些特定情況下他是不會默認添加分號的?,F在簡單介紹一下需要注意的幾個地方。

在這種情況時:

var x = 0[x+1,x+2,x+3].forEach(function(){console.log(x)})

這種情況下會導致程序無法正常運行。JavaScript在解析這段代碼是并不會在var x = 0后換行。
在寫代碼時如果以一條語句以 ”(”  ,"[" ,"+" ,"-"  ,"/"  開始時通常在上一條語句不會默認添加分號的。所以在這種情況下盡量保持一下這種寫法,在以這些字符開始時在行首添加一個分號,這樣可以保證在別人更改上面代碼時不加分號也不會影響以下代碼運行。

var x = 0;[x+1,x+2,x+3].forEach(function(){console.log(x)}) 

還有就是在涉及 return   break   continue  這種語句時盡量不要換行

return true;JavaScript會解析為return; true;在涉及  ++  和  --  這一系列運算時 在作為表達式的前綴或后綴時在換行是會有一定的問題,如下情況:var x = 0;var y = 0;x++y

JavaScript會解析為

x;++y;      而不是    x++;y;

雖然在JavaScript這門語言中  “;”  是可以省略不寫的,但是還是建議大家每句代碼后都跟上  “;”  養成這種良好的編碼習慣,畢竟在大多語言中不帶  “;”  的編碼適不適用的。

總結

以上所述是小編給大家介紹的JavaScript語句后面的分號問題,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 武邑县| 赣州市| 巨鹿县| 乐清市| 石渠县| 灵川县| 丰原市| 颍上县| 蒲城县| 固始县| 池州市| 巴彦淖尔市| 桑日县| 扶绥县| 余干县| 墨江| 内江市| 吕梁市| 盐源县| 邮箱| 平凉市| 日喀则市| 宁化县| 德州市| 黄梅县| 香格里拉县| 璧山县| 西昌市| 乐清市| 宁强县| 若尔盖县| 兖州市| 金坛市| 晋州市| 莱州市| 海晏县| 海晏县| 吴川市| 柘荣县| 杭锦后旗| 龙泉市|