ECMAScript2025正式釋出:支援16位浮點數、新的Set方法、匯入屬性與JSON模組……

6 月 26 日,ECMA 國際正式批准 ECMAScript 2025(第 16 版)語言規範。作為 JavaScript 演化的又一次關鍵節點,ES2025 引入了八項語言級新特性,本文將詳細解析這些特性!

Promise.try()

新增的 Promise.try() 方法可用於統一封裝同步返回值或拋錯的函式。相比以往常見的 Promise.resolve().then(fn) 或 new Promise(resolve => resolve(fn()))Promise.try(fn) 更簡潔高效。
舉個例子:
functionmightThrow({if (Math.random() > 0.5thrownewError("Oops");return"Success";}Promise.try(mightThrow)  .then(console.log)  .catch(console.error);
使用場景:
  • 適用於封裝第三方同步 API,使其具備統一的非同步處理能力;
  • 避免使用 Promise.resolve().then(fn) 引入的微任務延遲;
  • 可立即丟擲同步異常,提高錯誤可見性與除錯效率。
瀏覽器支援情況:

新的 Set 方法

ES2025 為 Set 例項新增七個方法,支援集合論基礎運算與集合關係判斷:
  • 集合運算方法(返回新 Set):
    • A.intersection(B):交集
    • A.union(B):並集
    • A.difference(B):差集
    • A.symmetricDifference(B):對稱差集
  • 集合關係方法(返回布林值):
    • A.isSubsetOf(B):是否為子集
    • A.isSupersetOf(B):是否為超集
    • A.isDisjointFrom(B):是否無交集
舉個例子:
const A = newSet([123]);const B = newSet([345]);console.log(A.union(B));             // Set {1,2,3,4,5}.log(A.intersection(B));      // Set {3}console.log(A.difference(B));        // Set {1,2}console.log(A.symmetricDifference(B)); // Set {1,2,4,5}console.log(A.isSubsetOf(B));        // falseconsole.log(A.isSupersetOf(B));      // falseconsole.log(A.isDisjointFrom(B));    // false
瀏覽器支援情況:

匯入屬性與 JSON 模組

ES2025 增加了匯入屬性,允許在 import 語句中指定附加資訊,以指定如何載入模組。主要用於引入非 JavaScript 資源(如 JSON 檔案或 CSS 模組)。例如,透過 with { type: 'json' } 屬性可將 JSON 檔案作為模組匯入,否則瀏覽器預設只加載 JS 模組。
靜態匯入時,可在路徑後加上 with 選項;動態匯入時,將其放在第二個引數的 with 欄位中,舉個例子:
// 靜態匯入 JSON 模組import config from'./config.json'with { type'json' };// 動態匯入 JSON 模組const config = awaitimport('./config.json', {with: { type'json' }});
使用場景:常用於直接匯入配置檔案、資料檔案或其他資源,簡化程式碼。例如,用於載入本地配置資料、國際化檔案等,而無需顯式發起 fetch 請求。相比手動請求後再處理,匯入屬性方式語法更簡潔,且可直接像引用 JS 模組一樣使用 JSON 資料。
瀏覽器支援情況:

同步迭代器輔助函式

ES2025 為所有同步迭代器(即實現了迭代器協議的物件)添加了一系列輔助方法,用於鏈式處理可迭代物件的資料。
  • .map(fn).filter(fn).flatMap(fn)
  • .some(fn).every(fn).find(fn)
  • .reduce(fn, init).forEach(fn)
  • .drop(n).take(n).toArray()
例如,對陣列使用 values() 生成迭代器後,可以鏈式呼叫:
const arr = ['a''''b''''c''''d'];const result = arr.values()              // 建立迭代器  .filter(x => x)                       // 過濾出非空字串  .map(x => x.toUpperCase())            // 轉為大寫  .toArray();                           // 轉回陣列console.log(result); // ['A','B','C','D']
以下列舉常用迭代器方法:
  • iterator.filter(fn):返回一個新的迭代器,只包含透過 fn 條件的元素。
  • iterator.map(fn)iterator.flatMap(fn):對每個元素應用對映函式,返回新迭代器。
  • iterator.some(fn)iterator.every(fn):測試是否有元素滿足條件,返回布林值。
  • iterator.find(fn)iterator.reduce(fn):返回第一個滿足條件的元素或規約後的值。
  • iterator.forEach(fn):對每個元素執行函式,無返回值。
  • iterator.drop(n):返回一個迭代器,跳過前 n 個元素。
  • iterator.take(n):返回一個迭代器,只包含前 n 個元素。
  • iterator.toArray():將剩餘元素收集為陣列並返回。
使用場景:
  • 惰性求值:只有在請求下一個值時才計算,適合處理大型或無限可迭代資料(如生成器、流資料等),可避免建立多箇中間陣列。
  • 用於非陣列可迭代物件(如 SetMap、字串等):使用迭代器方法可以逐步對資料進行過濾和轉換,記憶體效率更高,邏輯更加流暢。例如,處理檔案行流、網路流或流式資料時尤為方便。
瀏覽器支援情況:

RegExp.escape()

ES2025 新增加的RegExp.escape(str) 方法可以將字串中的正則元字元(如 *.?+() 等)轉義,使其可以安全地嵌入正則表示式中。
舉個例子:
const raw = "(foo)*+?";const escaped = RegExp.escape(raw);console.log(escaped);// 輸出 "\\(foo\\)\\*\\+\\?"
使用場景:
  • 動態生成正則表示式時避免語法錯誤;
  • 防止正則注入漏洞;
  • 替代手動維護的轉義函式。
瀏覽器支援情況:

正則表示式內聯標誌

ES2025 允許在正則表示式內部使用內聯語法 (?flags:...) 或 (?flags1-flags2:...) 以區域性開啟或關閉某些標誌位(如 ims)。
例如,正則 /^x(?i:HELLO)x$/ 的含義是在整個表示式外部沒有 i 標誌,而只對子串 HELLO 應用忽略大小寫。
/^x(?i:HELLO)x$/.test('xHELLOx'); // true (HELLO 匹配不區分大小寫)/^x(?i:HELLO)x$/.test('xhellox'); // true/^x(?i:HELLO)x$/.test('XhelloX'); // false (外圍的 x 匹配區分大小寫)
使用場景
  • 在複合表示式中區域性應用大小寫不敏感匹配;
  • 避免正則拆分與多輪匹配邏輯。

重複命名捕獲組

ES2025 允許在正則表示式的不同分支(由 | 分隔)中使用相同的命名捕獲組名稱。此前同名捕獲組會導致語法錯誤,但在 ES2025 中,只要這些同名組不可能同時匹配(即位於不同分支),就可以重用名字。這樣便於對形式不同但結構類似的文字進行統一處理。
例如,正則 /^((?<x>a)|(?<x>b))$/ 既允許匹配字元 'a' 又匹配 'b',無論哪種匹配,都使用同名組 x。匹配 'a' 時,groups.x 值為 'a';匹配 'b' 時,groups.x 值為 'b'
const re = /^((?<x>a)|(?<x>b))$/;console.log(re.exec('a').groups); // { x: 'a' }console.log(re.exec('b').groups); // { x: 'b' }
同樣地,解析日期字串可以寫成 /(?<year>\d{4})-\d{2}|\d{2}-(?<year>\d{4})/,它既匹配“YYYY-MM”也匹配“MM-YYYY”,而捕獲的年、月都儲存在同名 yearmonth 組中。
使用場景:重複命名捕獲組方便處理結構相似的多種格式,例如解析多種日期格式、鍵值對格式等場合。它使得匹配同一邏輯的不同模式可複用同一段處理程式碼,從而避免冗餘。例如,在同時支援“年-月”和“月/年”格式的正則中,統一使用 yearmonth 組即可簡化後續處理。
瀏覽器支援情況:

支援 16 位浮點數

ES2025 提供對 16 位浮點數的原生支援:
  • Float16Array:16 位浮點的 TypedArray 型別;
  • DataView.prototype.getFloat16() / setFloat16():讀取/寫入半精度浮點;
  • Math.f16round(number):將雙精度數值舍入為 16 位浮點精度。
const f16 = new Float16Array(2);f16[0] = 1.5;console.log(f16[0]); // 1.5const buf = newArrayBuffer(2);const view = newDataView(buf);view.setFloat16(01.5);console.log(view.getFloat16(0)); // 1.5console.log(Math.f16round(1.337)); // 1.3369140625
使用場景:
  • WebGPU / WebGL 中節省頻寬與記憶體;
  • 深度學習中傳遞模型引數;
  • 模擬硬體精度限制。
詳情檢視 
https://ecma-international.org/publications-and-standards/standards/ecma-262/


相關文章