javascript要不要加分號
JavaScript中的分號是可選的,加不加分號主要是個程式碼風格問題,但不要一會兒加一會不加。通常,如果語句以「(」、「[」、「/」、「 」、「-」開頭時,有可能被解釋為上一行語句的一部分;此時可以在行首防禦性的加上分號。
本教學操作環境:windows7系統、javascript1.8.5版、Dell G3電腦。
JavaScript 中的分號是可選的,加不加分號主要是個代碼風格問題。一種風格是使用分號明確結束語句,即便這些分號不是必需的;另一種風格是盡可能的不加分號,只在必要的情況才加。
註:分號可以加也可以不加,但不要一會加一會不加。
程式碼中分號的作用
分號的主要作用是:作為語句的斷言(EOS)用來結束一個程式語句,目的是讓解析器正確解析程式。在許多C-Style 語言裡,用分號明確結束一行語句,主要是為了降低語言編譯器開發的成本。但是現代編譯器都夠聰明了,可以很好的處理好多行語句。很多語言都不需要明確使用分號結尾如:Go、Scala、Ruby、Python、Swift、Groovy 等等。
雖然JavaScript 是C-like 語言,但它是有別於C、Java 的,在JavaScript 中分號也是可選的,它自動分號插入機制Auto Semicolon Insertion (ASI)。
JavaScript 自動分號插入機制
#JavaScript 有著自動分號插入的機制(Automatic Semicolon Insertion),簡稱ASI。在ECMA-262 - Automatic Semicolon Insertion中有關Automatic Semicolon Insertion 的明確說明:
從左到右解析程序,當遇到一個不符合任何文法產生式的token(offending token),那麼只要滿足下面條件之一就在違規token 前面自動插入分號。
至少一個換行符(LineTerminator)分割了違規token 和前一個token。
違規token 是}
。
從左到右解析程序,tokens 輸入流已經結束,當解析器無法將輸入token 流解析成單個完整ECMAScript 程序,那麼就在輸入流的結束位置自動插入分號。
-
從左到右解析程序,遇到一個某些文法產生式允許的token,但是它是受限操作(Restricted Productions),當至少一個換行符分割了受限的token 和前一個token,那麼就在受限token 前面自動插入分號。
然而,上述規則有一個附加的優先條件:如果插入分號後解析結果是空語句,或者如果插入分號後它成為for 語句頭部的兩個分號之一,那麼不會自動插入分號。
註:以上說明翻譯較為彆扭可以多讀幾遍或閱讀英文原文ECMA-262 - Automatic Semicolon Insertion
分號自動插入的情況
簡單歸納下,自動分號插入以換行為基礎,解析器會盡量將新行併入當前行,當且僅當符合ASI 規則時才會將新行視為獨立的語句
主要有以下自動插入規則:
#當新的一行併入目前行將構成非法語句無法正確解析時,將自動插入分號
當新行以
}
開頭時,即程式碼區塊的結束位置,將自動插入分號當以
return
語句結束時,在行末自動插入分號當以
break
語句結束時,在行末自動插入分號當以
throw
語句結束時,在行末自動插入分號-
當以
continu
e語句結束時,在行末自動插入分號 當以ES6 的yield 語句結尾時,在行末自動插入分號
--
後綴表達式作為新行的開始,在行首自動插入分號#原始碼檔案結尾自動插入號
如上所示,如果沒有加分號,執行這段程式碼這段程式碼將會報錯。
不能省略分號的情況
通常,如果語句以(
、[
、 /
、
、-
開始時,就有可能被解釋為上一行語句的一部分。實際中以/
、
、-
開頭的語句很少。但是以(
、[
開頭的語句則很常見,通常我可以在行首防禦性的加上分號。
前面,我們了解分號的自動插入,現在我們來看一些範例
let hey = 'hey' ['liu','liuxing'].forEach(console.log)
思考一秒鐘上面的結果是什麼?執行這段程式碼會拋出
Uncaught TypeError: Cannot read property 'forEach' of undefined
基於規則1 上面程式碼將會被解析成如下程式碼
let hey = 'hey'['liu','liuxing'].forEach(console.log)
可以看出,使用[
開頭的語句,前面沒有分號,很可能導致出錯。
再來看一個(
開頭的語句的範例程式碼
const a = 1 const b = 2 const c = a + b (a + b).toString()
你會以為上面的程式碼結果是「3」嗎?但其實它會拋出錯誤b is not a function
,因為根據ASI 規則,它會被解析成如下程式碼:
const a = 1;const b = 2;const c = a + b(a + b).toString()
我們就不一一介紹/
,
, -
作為語句開頭的情況了,這種情況比較少,大家可以自己試試。只要記住語句以(
、[
、 /
、
、-
開頭時,語句前面需要加上分號即可!
下面再在看看使用return的情況,
(() => { return { name: 'Liu Xing' } })()
你的期待值是不是傳回一個有name
的對象,但它卻回傳了undefined
。這是ASI 自動在 return
加上了分號。在這裡就得正確的換行以確保程式碼正確運行。我們可以看出除了正確的的分號,我們還需要正確合理的換行來使程式碼結構更為清晰。
總結
我們了解了JavaScript 的分號自動插入機制,並且知道了JavaScript 什麼時候會自動加入分號,在(
、[
、 /
、
、-
開頭時需要我們精確的加上分號。Automatic Semicolon Insertion機制為我們提供了兩種選擇,加或不加分號?完全看你或你的團隊的喜好了,現在我們也有prettier、Eslint 等工具來自動統一風格。
【相關推薦: javascript影片教學、程式設計基礎影片】
#以上是javascript要不要加分號的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

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

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

如何使用WebSocket和JavaScript實現線上語音辨識系統引言:隨著科技的不斷發展,語音辨識技術已成為了人工智慧領域的重要組成部分。而基於WebSocket和JavaScript實現的線上語音辨識系統,具備了低延遲、即時性和跨平台的特點,成為了廣泛應用的解決方案。本文將介紹如何使用WebSocket和JavaScript來實現線上語音辨識系

WebSocket與JavaScript:實現即時監控系統的關鍵技術引言:隨著互聯網技術的快速發展,即時監控系統在各個領域中得到了廣泛的應用。而實現即時監控的關鍵技術之一就是WebSocket與JavaScript的結合使用。本文將介紹WebSocket與JavaScript在即時監控系統中的應用,並給出程式碼範例,詳細解釋其實作原理。一、WebSocket技

如何利用JavaScript和WebSocket實現即時線上點餐系統介紹:隨著網路的普及和技術的進步,越來越多的餐廳開始提供線上點餐服務。為了實現即時線上點餐系統,我們可以利用JavaScript和WebSocket技術。 WebSocket是一種基於TCP協定的全雙工通訊協議,可實現客戶端與伺服器的即時雙向通訊。在即時線上點餐系統中,當使用者選擇菜餚並下訂單

如何使用WebSocket和JavaScript實現線上預約系統在當今數位化的時代,越來越多的業務和服務都需要提供線上預約功能。而實現一個高效、即時的線上預約系統是至關重要的。本文將介紹如何使用WebSocket和JavaScript來實作一個線上預約系統,並提供具體的程式碼範例。一、什麼是WebSocketWebSocket是一種在單一TCP連線上進行全雙工

JavaScript和WebSocket:打造高效的即時天氣預報系統引言:如今,天氣預報的準確性對於日常生活以及決策制定具有重要意義。隨著技術的發展,我們可以透過即時獲取天氣數據來提供更準確可靠的天氣預報。在本文中,我們將學習如何使用JavaScript和WebSocket技術,來建立一個高效的即時天氣預報系統。本文將透過具體的程式碼範例來展示實現的過程。 We

JavaScript教學:如何取得HTTP狀態碼,需要具體程式碼範例前言:在Web開發中,經常會涉及到與伺服器進行資料互動的場景。在與伺服器進行通訊時,我們經常需要取得傳回的HTTP狀態碼來判斷操作是否成功,並根據不同的狀態碼來進行對應的處理。本篇文章將教你如何使用JavaScript來取得HTTP狀態碼,並提供一些實用的程式碼範例。使用XMLHttpRequest

用法:在JavaScript中,insertBefore()方法用於在DOM樹中插入一個新的節點。這個方法需要兩個參數:要插入的新節點和參考節點(即新節點將要插入的位置的節點)。

JavaScript是一種廣泛應用於Web開發的程式語言,而WebSocket則是一種用於即時通訊的網路協定。結合二者的強大功能,我們可以打造一個高效率的即時影像處理系統。本文將介紹如何利用JavaScript和WebSocket來實作這個系統,並提供具體的程式碼範例。首先,我們需要明確指出即時影像處理系統的需求和目標。假設我們有一個攝影機設備,可以擷取即時的影像數
