溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

javascript要加分號(hào)嗎

發(fā)布時(shí)間:2022-09-30 10:20:40 來源:億速云 閱讀:106 作者:iii 欄目:web開發(fā)

今天小編給大家分享一下javascript要加分號(hào)嗎的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

JavaScript中的分號(hào)是可選的,加不加分號(hào)主要是個(gè)代碼風(fēng)格問題,但是不要一會(huì)加一會(huì)不加。通常,如果語句以“(”、“[”、“/”、“+”、“-”開頭時(shí),有可能被解釋為上一行語句的一部分;此時(shí)可以在行首防御性的加上分號(hào)。

本教程操作環(huán)境:windows7系統(tǒng)、javascript1.8.5版、Dell G3電腦。

JavaScript 中的分號(hào)是可選的,加不加分號(hào)主要是個(gè)代碼風(fēng)格問題。一種風(fēng)格是使用分號(hào)明確結(jié)束語句,即便這些分號(hào)不是必需的;另一種風(fēng)格是盡可能的不加分號(hào),只在必要的情況才加。

javascript要加分號(hào)嗎

注:分號(hào)可以加也可以不加,但是不要一會(huì)加一會(huì)不加。

代碼中分號(hào)的作用

分號(hào)的主要作用是:作為語句的斷言(EOS)用于結(jié)束一個(gè)程序語句,目的是讓解析器正確解析程序。在很多 C-Style 語言里,用分號(hào)明確結(jié)束一行語句,主要是為了降低語言編譯器開發(fā)的成本。但是現(xiàn)代編譯器都足夠聰明了,可以很好的處理好多行語句。很多語言都不需要明確使用分號(hào)結(jié)尾如:Go、Scala、Ruby、Python、Swift、Groovy 等等。

雖然 JavaScript 是 C-like 語言,但它是有別于 C、Java 的,在 JavaScript 中分號(hào)也是可選的,它自動(dòng)分號(hào)插入機(jī)制 Auto Semicolon Insertion (ASI)。

JavaScript 自動(dòng)分號(hào)插入機(jī)制

JavaScript 有著自動(dòng)分號(hào)插入的機(jī)制(Automatic Semicolon Insertion),簡(jiǎn)稱 ASI。在ECMA-262 - Automatic Semicolon Insertion中有關(guān) Automatic Semicolon Insertion 的明確說明:

  • 從左到右解析程序,當(dāng)遇到一個(gè)不符合任何文法產(chǎn)生式的 token(offending token),那么只要滿足下面條件之一就在違規(guī) token 前面自動(dòng)插入分號(hào)。

至少一個(gè)換行符(LineTerminator)分割了違規(guī) token 和前一個(gè) token。

違規(guī) token 是 }。

  • 從左到右解析程序,tokens 輸入流已經(jīng)結(jié)束,當(dāng)解析器無法將輸入 token 流解析成單個(gè)完整 ECMAScript 程序 ,那么就在輸入流的結(jié)束位置自動(dòng)插入分號(hào)。

  • 從左到右解析程序,遇到一個(gè)某些文法產(chǎn)生式允許的 token,但是它是受限操作(Restricted Productions),當(dāng)至少一個(gè)換行符分割了受限的 token 和前一個(gè) token,那么就在受限 token 前面自動(dòng)插入分號(hào)。

    然而,上述規(guī)則有一個(gè)附加的優(yōu)先條件:如果插入分號(hào)后解析結(jié)果是空語句,或如果插入分號(hào)后它成為 for 語句頭部的兩個(gè)分號(hào)之一,那么不會(huì)自動(dòng)插入分號(hào)。

注:以上說明翻譯較為別扭可以多讀幾遍或閱讀英文原文 ECMA-262 - Automatic Semicolon Insertion

分號(hào)自動(dòng)插入的情況

簡(jiǎn)要?dú)w納下,自動(dòng)分號(hào)插入以換行為基礎(chǔ),解析器會(huì)盡量將新行并入當(dāng)前行,當(dāng)且僅當(dāng)符合 ASI 規(guī)則時(shí)才會(huì)將新行視為獨(dú)立的語句

主要有以下自動(dòng)插入規(guī)則:

  • 當(dāng)新的一行并入當(dāng)前行將構(gòu)成非法語句不能正確解析時(shí),將自動(dòng)插入分號(hào)

  • 當(dāng)新行以}開頭時(shí),即代碼塊的結(jié)束位置,將自動(dòng)插入分號(hào)

  • 當(dāng)以return語句結(jié)束時(shí),在行末自動(dòng)插入分號(hào)

  • 當(dāng)以break語句結(jié)束時(shí),在行末自動(dòng)插入分號(hào)

  • 當(dāng)以throw語句結(jié)束時(shí),在行末自動(dòng)插入分號(hào)

  • 當(dāng)以continue語句結(jié)束時(shí),在行末自動(dòng)插入分號(hào)

  • 當(dāng)以 ES6 的 yield 語句結(jié)尾時(shí),在行末自動(dòng)插入分號(hào)

  • ++、-- 后綴表達(dá)式作為新行的開始,在行首自動(dòng)插入分號(hào)

  • 源代碼文件末尾自動(dòng)插入號(hào)

如上所示,如果沒加分號(hào),運(yùn)行這段代碼這段代碼將報(bào)錯(cuò)。

不能省略分號(hào)的情況

通常,如果語句以(、[、 /+、-開頭時(shí),就有可能被解釋為上一行語句的一部分。實(shí)際中以/、+、-開頭的語句很少。但是以([開頭的語句則很常見,通常我可以在行首防御性的加上分號(hào)。

前面,我們了解分號(hào)的自動(dòng)插入,現(xiàn)在我們來看一些示例

let hey = 'hey'
['liu','liuxing'].forEach(console.log)

思考一秒鐘上面的結(jié)果是什么?運(yùn)行這段代碼會(huì)拋出

Uncaught TypeError: Cannot read property 'forEach' of undefined

基于規(guī)則 1 上面代碼將會(huì)被解析成如下代碼

let hey = 'hey'['liu','liuxing'].forEach(console.log)

可以看出,使用[開頭的語句,前面沒有分號(hào),很可能導(dǎo)致出錯(cuò)。

再來看一個(gè)(開頭的語句的示例代碼

const a = 1
const b = 2
const c = a + b
(a + b).toString()

你會(huì)以為上面的代碼結(jié)果是“3”嗎?但是實(shí)際上它會(huì)拋出錯(cuò)誤b is not a function,因?yàn)楦鶕?jù) ASI 規(guī)則,它會(huì)被解析成如下代碼:

const a = 1;const b = 2;const c = a + b(a + b).toString()

我們就不一一介紹/, +, - 作為語句開頭的情況了,這種情況比較少,大家可以自己試試。只需要記住語句以(、[、 /、+、-開頭時(shí),語句前需要加上分號(hào)即可!

下面再在看看使用return的情況,

(() => {
  return
  {
    name: 'Liu Xing'
  }
})()

你的期待值是不是返回一個(gè)帶有 name 的對(duì)象,但是它卻返回了undefined。這是 ASI 自動(dòng)在return給加上了分號(hào)。在這兒就得正確的換行以確保代碼正確運(yùn)行。我們可以看出除了正確的的分號(hào),我們還需要正確合理的換行來使代碼結(jié)構(gòu)更為清晰。

以上就是“javascript要加分號(hào)嗎”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI