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.5) thrownewError("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([1, 2, 3]);const B = newSet([3, 4, 5]);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()
:將剩餘元素收集為陣列並返回。
使用場景:
-
惰性求值:只有在請求下一個值時才計算,適合處理大型或無限可迭代資料(如生成器、流資料等),可避免建立多箇中間陣列。 -
用於非陣列可迭代物件(如 Set
、Map
、字串等):使用迭代器方法可以逐步對資料進行過濾和轉換,記憶體效率更高,邏輯更加流暢。例如,處理檔案行流、網路流或流式資料時尤為方便。
瀏覽器支援情況:

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

正則表示式內聯標誌
ES2025 允許在正則表示式內部使用內聯語法
(?flags:...)
或 (?flags1-flags2:...)
以區域性開啟或關閉某些標誌位(如 i
, m
, s
)。例如,正則
/^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”,而捕獲的年、月都儲存在同名 year
、month
組中。使用場景:重複命名捕獲組方便處理結構相似的多種格式,例如解析多種日期格式、鍵值對格式等場合。它使得匹配同一邏輯的不同模式可複用同一段處理程式碼,從而避免冗餘。例如,在同時支援“年-月”和“月/年”格式的正則中,統一使用
year
、month
組即可簡化後續處理。瀏覽器支援情況:

支援 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(0, 1.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/