欧美成人精品手机在线观看_69视频国产_动漫精品第一页_日韩中文字幕网 - 日本欧美一区二区

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

JavaScript到底應不應該加分號?JavaScript自動插入分號規則詳解

freeflydom
2024年1月18日 14:8 本文熱度 573

JavaScript 提供了 automatic semicolon insertion (ASI)自動插入分號規則,在不加分號的情況下,會自動補充分號來分隔不同語句。

導致在繼左大括號換行、tab 和 space 圣戰后,前端又出現了一場戰爭。

并且隨著那個男人加入這場討論之后,關于是否應該加分號的討論更是激烈了。

ASI 自動插入分號規則

在決定是否添加分號之前,我們先來了解一下編譯器到底在哪些情況下會自動插入分號,哪些情況必須手動添加分號。

會自動添加分號的情況

1.遇到換行符,但是兩句代碼連接是無效代碼

// 代碼

42

'hello'


// `42 'hello'`連接在一起是無效語句,所以會自動在之間插入分號

42;'hello'


// 直接明確的寫法

42;"hello"

// 代碼

let a = 10, b = 5

a

-

b


// a - b 為有效代碼,所以三者之間不會自動加分號

a = 1; b = 2;


// 直接明確的寫法

a - b


2.遇到換行符,但是兩句代碼之間不允許有換行符

// 代碼

foo

++

bar

++

baz


// foo 和 ++ 符合規則1,但是不符合 no LineTerminator here規則,所以會添加分號

foo; 

++bar; 

++baz;

在 JS 標準中,有個 no LineTerminator here 的規則,規定哪些語法不能加入換行符,如果開發者加了換行符,則 JS 編譯器會無法識別并加入分號。

  1. 帶標簽的continue語句,不能continue后插入換行;

  2. 帶標簽的break語句,不能在break后面插入換行;

  3. return后面不能插入換行;

  4. 后自增、后自減運算符前不能插入換行;

  5. throwException之間不能插入換行;

  6. async關鍵字,后面不能插入換行;

  7. 箭頭函數的箭頭前,不能插入換行;

  8. yield之后,不能插入換行。

3.Restricted productions
如果這些標簽后,空一行書寫其它語句,則會自動在這些標簽后添加分號:

  • ++ or --

  • return

  • break

  • continue

  • ES6 yield 、async 等

  • 反引號`

// return 后空一行再書寫語句,則會自動在 return 后加分號

return

{

  a: 1

}


// 這是正確寫法

return {

  a: 1

}

其它標簽類似。

如果手動在這些標簽后加上分號,同樣也是錯誤的,比如:

// 空一行再寫 a,會自動在 ++ 后添加分號

++

a


// 就算手動添加,和上面結果一樣是錯誤的

++;

a;

所以針對 Restricted productions ,無論讓編譯器自動添加分號,還是自己手動加上分號,都是錯誤的,都應該去避免去換行,避免寫這種寫法。

必須手動加分號的情況

以下面這些標簽開頭的命令,必須在前面加分號,和前面一個語句分隔:

  • + 和 -:語句以 + 或者 - 開頭

  • /: 語句以正則表達式開頭

  • ( : 語句以自執行函數開頭

  • [: 語句以數組開頭

舉例說明:

// 錯誤

a = b

+a

// 正確

a = b

;+a



// 錯誤

a = b

/something/.test(a)

// 正確

a = b

;/something/.test(a)


// 錯誤

a = b

(function () {})()

// 正確

a = b

;(function() {})()


// 錯誤

a = b

[1, 2, 3].forEach()

// 正確

a = b

;[1, 2, 3].forEach()

上面的情況,如果第二行代碼不手動添加分號的話,兩行代碼會合并在一起導致結果錯誤或者報錯。

上面幾種情況中,只有自執行函數和數組開頭會在極少情況下遇到,記住這兩個前面要手動加上分號即可。

就算是習慣加分號的朋友,但仍然要注意下面的情況:

// 不需要結尾添加分號

if () {


// 不需要結尾添加分號

for () {


// 不需要結尾添加分號

while () {


// 需要在結尾添加分號

var a = function () {

}; 


// 需要在結尾添加分號

var a = {

  prop: value

}; 


// 報錯

[1, 2, 3].forEach();

即便習慣寫分號的朋友,也很少有人在 if 、forwhile 等語句 } 后寫分號,但是如果使用賦值的形式傳遞,則一定要注意在 } 把分號添加上,以避免后面語句出現自執行和數組開頭的語句。

推薦遇到自執行和數組開頭的,直接前面加上分號就完事了。

總結

是否添加和是否手動加是兩回事,我們可以用 eslint、Prettier 等工具自動生成或者刪除分號,是否手動加可以看個人喜好,最終代碼內可以根據項目要求用工具生成。

但都要注意必須添加分號的幾種情況。

參考文章

作者:程序員李林

轉自:https://www.cnblogs.com/easy1996/p/17972476


該文章在 2024/1/18 17:17:04 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved