跳轉到

2025:ECMAScript 2025 與未來展望#

事件#

2025年6月,ECMAScript 2025(ES16) 發佈。主軸是模組載入與 Set 數學運算的標準化,以及長跑多年的 Temporal 曆法提案接近完成。

新語法與特性#

1. Import Attributes(import ... with { type: "json" })#

  • 為何加入:匯入 JSON/CSS 等非 JS 模組以前語義不明(型別猜測有 MIME 偽造風險)。
  • 理論原因:模組解析的明確宣告——匯入者聲明期望的內容型別,載入器強制驗證。
  • 實用原因:import data from "./config.json" with { type: "json" } 一行搞定,安全且明確。
  • 彌補缺陷:非 JS 模組匯入的語義模糊與安全風險。

2. Set 方法(intersection、union、difference、symmetricDifference、isSubsetOf 等)#

  • 為何加入:Set(ES6)只有 add/delete/has,集合的數學運算(交集、聯集、差集)要手寫迴圈或 filter。
  • 理論原因:集合論運算是資料處理的基礎(Python 的 set 運算子 &、| 早已內建);命名採完整語義(intersection 而非符號)。
  • 實用原因:權限比較、標籤交集、資料比對是高頻操作。
  • 彌補缺陷:Set 缺少集合論運算的不完整。

3. 正則表達式重複命名群組((?<year>\d{4})|(?<year>\d{2}))#

  • 為何加入:同名群組在多分支中以前不允許,只能用不同名稱再合併。
  • 實用原因:多格式匹配(如多種日期格式)中,分支共用語義名稱。
  • 彌補缺陷:命名群組(ES2018)在多分支場景的限制。

4. Iterator.prototype 鏈式輔助器標準化#

5. Promise.try#

  • 為何加入:把「可能同步拋錯的函數」統一包裝成 Promise,以前要 new Promise(res => res(fn()))——同步例外不會被捕捉。
  • 理論原因:統一同步/非同步錯誤邊界。
  • 彌補缺陷:同步拋錯逃逸出 Promise 鏈的缺陷。

即將到來的重大提案#

Temporal(曆法與時間 API)#

  • 為何重要:Date 是 1995 年十天創造期的產物,照抄 Java 1.0 的 java.util.Date——可變性(mutability)、時區處理混亂、月份從0開始、解析不可靠,是 JavaScript 最惡名昭彰的內建物件之一。
  • 理論原因:對應 Java 8 的 java.time(Joda-Time 傳統)——不可變、明確時區、ISO 8601 為主。
  • 彌補缺陷:Date 的可變性、時區缺陷與 API 混亂。Temporal 經過八年以上的設計打磨,是 TC39 史上最嚴謹的提案。

其他未來方向#

  • Decorator(裝飾器):TypeScript/Angular 生態多年的需求,進入 Stage 3。
  • 模式匹配(pattern matching):借鑑 Rust/Swift/ML 的 match 語法,長期提案。
  • Explicit Resource Management(using 語句):對應 Python 的 with、C# 的 using——資源釋放的確定性管理(已進 Stage 3/4)。
  • 類型標註注記(Types as Comments):讓 JS 引擎原生忽略型別語法,TS 不用轉譯的未來願景。

理論總結#

ES2025 延續「族譜補齊與成熟借鑑」:Set 補齊集合論、import attributes 補齊模組語義、Promise.try 補齊錯誤邊界。未來的主戰場是 Date 的替代(Temporal)——把最後一個重大歷史包袱清除。

實用總結#

三十年來的軌跡清晰可見:瀏覽器腳本(1995)→ 標準化(1997)→ 玩具補齊(ES3, 1999)→ 務實補丁(ES5, 2009)→ 現代化(ES6, 2015)→ 年度精緻化(2016–)。JavaScript 從十天的應急之作,長成橫跨瀏覽器(Chrome/Firefox/Safari)、伺服器(Node/Deno/Bun)、桌面(Electron)與行動裝置(React Native)的通用語言。

相關條目#

程式範例#

1. Import Attributes:明確宣告非 JS 模組#

// ES2024 之前:匯入 JSON 語義不明(型別猜測有 MIME 偽造風險)
import data from "./config.json" with { type: "json" };  // ES2025 標準化
data.version;   // 直接可用

// CSS 模組同理
import styles from "./theme.css" with { type: "css" };

2. Set 方法:集合論運算補齊#

const a = new Set([1, 2, 3]);
const b = new Set([2, 3, 4]);

// ES2024 之前:交集要手寫 filter
const common = [...a].filter((x) => b.has(x));   // [2, 3]

// ES2025:集合論一行(Python 對照:a & b, a | b, a - b)
a.intersection(b);           // Set(2) {2, 3}——交集
a.union(b);                  // Set(4) {1, 2, 3, 4}——聯集
a.difference(b);             // Set(1) {1}——差集
a.symmetricDifference(b);    // Set(2) {1, 4}——對稱差
a.isSubsetOf(b);             // false

// 應用:權限比較
const required = new Set(["read", "write"]);
const granted = new Set(["read", "write", "admin"]);
required.isSubsetOf(granted);   // true——權限足夠

3. Promise.try:統一同步/非同步錯誤邊界#

// 同步拋錯會逃逸出 Promise 鏈
const p = new Promise((res) => res(JSON.parse(text)));  // parse 拋錯 → 不被捕
const p = Promise.try(() => JSON.parse(text));          // 同步錯誤也進入鏈

4. 未來:Temporal 曆法 API(替代惡名昭彰的 Date)#

// Date 的歷史缺陷(1995十天創造的產物)
const d = new Date(2026, 9, 8);   // 月份從 0 開始!9 是十月
d.setMonth(d.getMonth() + 1);     // 可變性——改了原物件
d.getTimezoneOffset();            // 時區處理混亂

// Temporal:不可變、明確時區(Java 8 java.time 傳統)
Temporal.PlainDate.from("2026-10-08");
date.add({ months: 1 });          // 回傳新物件,不改原值(ES2023 不可變哲學的延伸)
Temporal.ZonedDateTime.from("2026-10-08T09:00[Asia/Taipei]");

5. 未來:using 語句(資源確定釋放)#

// 對應 Python 的 with、C# 的 using
{
  using handle = openResource();   // 離開區塊自動釋放(Symbol.dispose)
  use(handle);
}   // handle 自動關閉——try/finally 樣板的消失