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 鏈式輔助器標準化#
- 2024年提案的迭代器輔助器全面標準化落地,惰性組合成為語言級能力(見 2024-ES2024分組與迭代輔助器)。
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 樣板的消失