以下透過本文給大家詳細介紹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開頭。
- 特別是和
##都非常常用的statement開頭。
-
特別是和
##。 --單獨被斷為一行的時候,因為JS的語法規則規定後自增運算不允許中間插入換行,所以和--會被視為前自增而跟下一行連接在一起。 - #第二種是return作為上一行結尾的情況,下一行以以下開頭時,會產生語法歧義:
- function delete void typeof ( [ { Identifier -- - ~ !
- 同樣因為JS語法的規則不允許在return 和後面的值之間插入換行,所以return之後只要有換行符就會視為有分號,這常常會與使用者的期望不符合。
- 第三種是下一行以和-開頭的情況,上一行以以下結尾是,會產生語法歧義:
- -- IdentifierName ] ) } RegularExpressionLiteral
- 因為很少有語句以或-開頭,所以這種情況不算危險。
- 第四種是上一行以break、continue結尾的情況,下一行以Identifier開頭時,會產生語法歧義。
- 第五種是下一行以(和[開頭的情況,上一行以以下結尾是,會產生語法歧義:
- -- IdentifierName ] ) } RegularExpressionLiteral StringLiteral NumericLiteral BooleanLiteral NullLiteral Identifier thisLiteral NumericLiteral BooleanLiteral NullLiteral Identifier this
- 這種情況非常危險(所以hax的文章中要提出這種情況應該語句前寫分號),幾乎上一行的所有情況都將導致正常期望之外的結果。
- 第六種是,當下一行以RegularExpressionLiteral 開頭的情況,上一行的以下結尾,會導致/被理解為除號:
-- IdentifierName ] ) } RegularExpressionLiteral StringLiteral NumericLiteral BooleanLiteral NullLiteral Identifier this
- 總結,
-
- var if do while for continue break return with switch throw try debugger幾種關鍵字開頭的語句,以及空語句,上一行加不加分號影響不大。
- 凡表達式語句和函數表達式語句,後面不加分號非常危險,情況極為複雜。
凡(和[開頭的語句,前面不加分號極度危險。
##下面在透過實例程式碼介紹下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語句中有關後面的分號問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Python和JavaScript在社區、庫和資源方面的對比各有優劣。 1)Python社區友好,適合初學者,但前端開發資源不如JavaScript豐富。 2)Python在數據科學和機器學習庫方面強大,JavaScript則在前端開發庫和框架上更勝一籌。 3)兩者的學習資源都豐富,但Python適合從官方文檔開始,JavaScript則以MDNWebDocs為佳。選擇應基於項目需求和個人興趣。

從C/C 轉向JavaScript需要適應動態類型、垃圾回收和異步編程等特點。 1)C/C 是靜態類型語言,需手動管理內存,而JavaScript是動態類型,垃圾回收自動處理。 2)C/C 需編譯成機器碼,JavaScript則為解釋型語言。 3)JavaScript引入閉包、原型鍊和Promise等概念,增強了靈活性和異步編程能力。

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

JavaScript在現實世界中的應用包括服務器端編程、移動應用開發和物聯網控制:1.通過Node.js實現服務器端編程,適用於高並發請求處理。 2.通過ReactNative進行移動應用開發,支持跨平台部署。 3.通過Johnny-Five庫用於物聯網設備控制,適用於硬件交互。

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫

JavaScript是現代Web開發的核心語言,因其多樣性和靈活性而廣泛應用。 1)前端開發:通過DOM操作和現代框架(如React、Vue.js、Angular)構建動態網頁和單頁面應用。 2)服務器端開發:Node.js利用非阻塞I/O模型處理高並發和實時應用。 3)移動和桌面應用開發:通過ReactNative和Electron實現跨平台開發,提高開發效率。

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SublimeText3漢化版
中文版,非常好用

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

Dreamweaver Mac版
視覺化網頁開發工具

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。