你知道 ES6 的 arrow function 和 const、let 關鍵字是如何誕生的嗎?這些讓 JavaScript 變得更現代化的功能,並不是某個天才工程師靈光一閃的產物,而是經過一個嚴謹組織深思熟慮的結果。
這個組織就是 TC39,一個決定 JavaScript 未來發展方向的技術委員會。如果你曾經好奇過這些新功能是誰決定的、為什麼要加入這些特定的語法,那麼今天我們就來深入了解這個組織。
TC39 是什麼?
TC39 的全名是 Technical Committee 39(第39技術委員會),隸屬於 ECMA International 這個國際標準化組織。TC39 是一群 JavaScript 開發者、實作者、學者等人組成的團體,與社群合作維護和發展 JavaScript 的定義。
你可能會好奇為什麼叫「39」?這其實只是 ECMA International 內部的編號系統,TC39 是第39個技術委員會。雖然聽起來很隨意,但這個數字背後代表的是 JavaScript 語言標準的權威機構。
為什麼是 ECMAScript 而不是 JavaScript?
這裡有個有趣的小知識:在正式文件中,TC39 從來不使用「JavaScript」這個詞,而是稱為「ECMAScript」。原因是 Oracle 擁有「JavaScript」這個商標,為了避免法律問題,ECMA 決定使用 ECMAScript 這個詞。
在實際使用上,ECMAScript 通常指的是正式標準(ECMA-262),而 JavaScript 則是我們日常討論這個語言時使用的名稱。
誰能參與 TC39?
TC39 的組成相當有趣。委員會成員主要是「會員」,通常是瀏覽器廠商和在網路技術上投資很大的大公司,像是 Facebook、PayPal 等。這些公司會派遣「代表」參與會議,這些代表就是實際負責創建、審核或否決語言提案的人。
為了參與會議,這些公司需要先加入 ECMA International,然後派遣代表參與 TC39 的討論。這個設計確保了參與者都是真正會被決策影響的利害關係人。
有趣的是,TC39 的運作方式是基於共識的:需要大多數人同意,且沒有人強烈反對到願意動用否決權。這種決策方式雖然可能比較慢,但確保了所有重要的聲音都能被聽到。
提案如何從想法變成標準?
這是最精彩的部分。TC39 建立了一套嚴謹的流程,每個新功能都必須經過五個階段(Stage 0 到 Stage 4)才能成為正式標準。
Stage 0:Strawperson(稻草人階段)
任何對 ECMAScript 語言的想法、討論或提案,只要還沒有提交為正式提案,都被視為 strawperson(Stage 0),沒有接受標準。
這個階段基本上就是「有個想法」的階段,任何人都可以提出。
Stage 1:Proposal(提案階段)
要進入 Stage 1,TC39 必須宣布他們願意檢視、討論並貢獻這個提案。從這個階段開始,預期會有重大變更。
這個階段需要:
- 確定一個正式的「champion」(提案負責人)
- 描述要解決的問題
- 提供使用範例
- 識別可能的挑戰
Stage 2:Draft(草稿階段)
這是規格的第一個版本。到了這個階段,這個功能最終被納入標準的可能性很高。
Stage 2 的要求更加嚴格:
- 必須有正式的語法和語意描述
- 需要兩個實驗性實作(其中一個可以是 Babel 等轉譯器)
- 只預期會有漸進式修改
Stage 3:Candidate(候選階段)
提案大致完成,現在需要來自實作和使用者的回饋才能進一步發展。
這個階段的要求:
- 規格文本必須完整
- 指定的審查者和 ECMAScript 規格編輯必須簽核
- 至少需要兩個符合規格的實作
Stage 4:Finished(完成階段)
提案準備好被納入標準。
最終階段需要:
- Test262 驗收測試
- 兩個符合規格的正式實作通過測試
- 大量的實際使用經驗
- ECMAScript 規格編輯的最終簽核
實際例子:Optional Chaining 的發展歷程
讓我用一個我們現在經常使用的功能來說明這個流程:Optional Chaining(?.)。
還記得以前我們要檢查深層物件屬性時的痛苦嗎?
// 以前我們得這樣寫
if (user && user.address && user.address.street) {
console.log(user.address.street.name);
}
現在有了 Optional Chaining,可以優雅地寫成:
// 現在可以這樣寫
console.log(user?.address?.street?.name);
這個功能從最初的想法到成為標準,經歷了完整的 TC39 流程。Optional Chaining 在2017年6月開始作為提案,經過多次討論和修改,最終在2019年12月達到 Stage 4,成為正式標準。
最近的發展動態
在2024年10月的 TC39 會議中,Import attributes(連同 JSON 模組)達到了 Stage 4。這表示開發者很快就能在所有 JavaScript 環境中原生匯入 JSON 檔案:
import myData from "./data.json" with { type: "json" };
在2024年6月的會議中,有八個提案進展到下一個階段,包括 Iterator Sequencing 和 Joint Iteration 等功能。
如何跟上 TC39 的腳步
身為前端開發者,建議關注但不要過度焦慮。以下是實用的追蹤方式:
官方資源
- TC39 官網:https://tc39.es/ - 可以看到目前 Stage 3 的提案
- GitHub Repository:https://github.com/tc39/proposals - 完整的提案列表
- 會議紀錄:TC39 會議記錄 - 每兩個月的會議都有公開紀錄
實用的追蹤策略
對開發工作的影響
TC39 的決策直接影響日常開發。像是:
- Async/await:讓異步程式碼更易讀
- Optional Chaining:減少冗長的條件檢查
-
Nullish Coalescing(
??):更精確的預設值處理
這些功能都是 TC39 深思熟慮的結果,不是隨意加入的語法糖。
值得期待的未來功能
目前在 Stage 2 和 Stage 3 的提案中,有幾個我特別期待的:
- Temporal API:全新的日期時間處理 API,要說再見給 Date 物件的各種坑了
- Record & Tuple:不可變的資料結構
-
Pipeline Operator(
|>):函數式程式設計愛好者的福音
我們能參與嗎?
雖然正式的 TC39 會議需要公司會員身份,但 TC39 歡迎來自 JavaScript 社群的貢獻,無論是對現有提案的回饋、改善文件、測試、實作,甚至是語言功能的想法。
你可以:
結語
TC39 看似神秘,但其實是個相當開放的組織。他們的工作直接影響著我們每天使用的 JavaScript,而他們的決策過程也充分體現了「穩定中求進步」的理念。
由於2016年開始的年度發佈週期,新功能變得更加漸進式,也更容易採用。我們不再需要像 ES6 那樣一次消化太多新功能,而是可以循序漸進地學習和使用。
下次當你使用 const、async/await 或 ?. 的時候,可以想想 TC39 的辛勞工作。他們讓 JavaScript 持續進化,同時保持向後相容,這真的不是件容易的事。
對了,如果你對某個 JavaScript 功能特別有感覺,不妨去 TC39 的 GitHub 看看相關討論。說不定你的想法能為 JavaScript 的未來發展貢獻一份力量。