iT邦幫忙

2023 iThome 鐵人賽

DAY 11
0
自我挑戰組

複習 JavaScript 核心概念系列 第 11

[Day 11] JavaScript 可以不加分號?關於「自動分號插入(ASI)」

  • 分享至 

  • xImage
  •  

在大部分程式語言中,分號通常被放在一行程式碼的最尾端,來表示這行程式碼到這裡就結束了。
然而在 JavaScript 中,你可能會注意到,有時候你可以不加分號而程式碼仍然運作正常。這是因為 JavaScript 具有一個稱為「自動分號插入」(Automatic Semicolon Insertion,簡稱 ASI)的機制。本篇文章將介紹 ASI,以及談談到底要不要省略分號。


什麼是自動分號插入(ASI)?

ASI 是 JavaScript 解析器中的一個機制,它幫助確定在哪些位置插入分號,以結束程式碼行。當 JavaScript 發現某行程式碼後面缺少分號且語法合法時,它會嘗試自動插入分號,以確保程式碼的正確性。

關於 ASI 的規則其實非常多,這裡就只舉一些較常見的例子。

下面的第一行程式碼尾端會自動插入分號,將 a 和 b 分開

let a = 42
let b = 15 

但是下面這樣的寫法是不行的:

let a=1 let b=2 // 報錯

ASI 的機制,在某些情況可能不是那麼直覺

ASI 會自動幫我們補上分號,聽起來很方便,但它也可能造成一些容易誤解的情況。直接看例子。

  1. 以下函式的 return 後面會被補上分號,導致回傳結果為 undefined 而不是物件。
function getItem() {
  return
  {
    message: 'Hello' 
  }
}

const myItem = getItem();
console.log(myItem); // 印出 undefined
  1. 以下兩個立即函式只會輸出「AAA」並接著報錯,
    這是因為 ASI 規則中,新的一行開頭是 ([/ ,則不會自動補上分號。
(function printA() {
  console.log('AAA');
})()

(function printB() {
  console.log('BBB');
})()

所以實際開發時到底要不要省略分號?

直接說我的想法,我個人偏向盡量不要省略分號。理由如下:

  • 避免潛在問題:上面的例子其實只舉了一部分,其實還有一些容易出錯的情境,但其實只要好好地補上分號的話,大部分的時候根本不用擔心出現這些情況了。
  • 可讀性:省略分號其實對程式碼的簡潔程度影響不大,但是明確添加分號可以增強程式碼的可讀性,因為它清楚地標示了語句的結尾,有助於其他人更容易理解你的程式碼。
  • 符合慣例:明確添加分號可能更符合大部分開發者或團隊的習慣。尤其有些程式語言是需要明確使用分號的,例如 C/C++JavaC# 等,這時省略分號可是會直接吃編譯錯誤的。

總結

今天介紹了 JavaScript 的 自動分號插入(ASI)。雖然我並不支持省略分號,但我認為我們還是需要大概了解一下 JavaScript 的省略分號機制,所以還是拿出來講了。那麼今天就到這邊,明天見~


上一篇
[Day 10] 非同步任務的兩種類型:Macrotask 與 MicroTask
下一篇
[Day 12] 表達式(Expression)與陳述式(Statement)
系列文
複習 JavaScript 核心概念30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言