ECMAScript 2025 正式發布,一大波超實用特性來襲!
6 月 26 日,ECMA 國際正式批準 ECMAScript 2025(第 16 版)語言規范。作為 JavaScript 演化的又一次關鍵節點,ES2025 引入了八項語言級新特性,本文將詳細解析這些特性!
圖片
Promise.try()
新增的 Promise.try() 方法可用于統一封裝同步返回值或拋錯的函數。相比以往常見的 Promise.resolve().then(fn) 或 new Promise(resolve => resolve(fn())),Promise.try(fn) 更簡潔高效。
舉個例子:
function mightThrow() {
if (Math.random() > 0.5) throw new Error("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 = new Set([1, 2, 3]);
const B = new Set([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)); // false
console.log(A.isSupersetOf(B)); // false
console.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 = await import('./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.5
const buf = new ArrayBuffer(2);
const view = new DataView(buf);
view.setFloat16(0, 1.5);
console.log(view.getFloat16(0)); // 1.5
console.log(Math.f16round(1.337)); // 1.3369140625使用場景:
- WebGPU / WebGL 中節省帶寬與內存;
- 深度學習中傳遞模型參數;
- 模擬硬件精度限制。




























