首頁 > web前端 > js教程 > 主體

在JavaScript語句中有關後面的分號問題

亚连
發布: 2018-06-21 18:56:05
原創
1826 人瀏覽過

以下透過本文給大家詳細介紹javascript中的語句後面的分號問題,本文跟大家介紹的非常詳細,需要的朋友參考下吧

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 tr​​ue false NumericLiteral StringLiteral RegularExpressionLiteral ( [ { Identifier -- - ~ ! 

  3. 其中,function和delete是非常常用的statement開頭。

  4. 特別是和

    ##都非常常用的statement開頭。

  5. 特別是和

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

-- IdentifierName ] ) }  RegularExpressionLiteral StringLiteral NumericLiteral BooleanLiteral NullLiteral Identifier this

  1. 總結,

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

凡(和[開頭的語句,前面不加分號極度危險。

##下面在透過實例程式碼介紹下JavaScript中的分號問題

一般在比較懶的前台程式設計師中經常會碰到一些莫名其妙的問題。

###今天僅討論一下在在JS中常常會碰到一些關於分號的問題。JavaScript這門語言是可以省略分號的,是因為它會換行符後如果缺少分號就會無法編譯時它會默認添加上分號,但是在某些特定情況下他是不會預設加分號的。現在簡單介紹一下需要注意的幾個地方。######在這種情況時:###
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中如何判断变量名是否存在数组中

通过JS如何实现延迟隐藏功能

使用Angular如何实现定时器功能

使用Angular如何实现三角箭头标注功能

以上是在JavaScript語句中有關後面的分號問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!