JavaScript 语言标准 ECMAScript 2025 候选版已于 3 月发布,正式版预计 6 月落地。
此次更新聚焦开发者痛点,从正则处理到异步编程均有实用性改进,以下选取核心特性展开分析,新功能一览:
| 类别 | 提案 | 完成时间 | 预计发布年份 |
|---|---|---|---|
| Promise 和迭代器改进 | Promise.try | 2024 年 10 月 | 2025 |
| 同步迭代器辅助函数 | 2024 年 10 月 | 2025 | |
| 正则表达式增强 | RegExp.escape | 2025 年 2 月 | 2025 |
| 正则表达式模式修饰符 | 2024 年 10 月 | 2025 | |
| 重复命名捕获组 | 2024 年 4 月 | 2025 | |
| 集合和模块更新 | JSON 模块 | 2024 年 10 月 | 2025 |
| 导入属性 | 2024 年 10 月 | 2025 | |
| 新的 Set 方法 | 2024 年 4 月 | 2025 | |
| TypedArray 增强 | TypedArrays 、 DataView 和 Math.f16round 上的 Float16 | 2025 年 2 月 | 2025 |
Promise.try
Promise.try(fn) 用于将函数 fn 包装成 Promise,同步执行并处理异常,统一同步和异步行为。
以前,处理可能同步或异步的函数需要 Promise.resolve().then(fn),但这异步执行,影响性能;或用 new Promise(resolve => resolve(fn())),代码冗长。
1 | function mightThrow() { |
在 ES2025 中可以这样:
1 | Promise.try(mightThrow) |
同步迭代器辅助函数
为 Iterator.prototype 添加方法如 map、filter、take、drop 等,增强迭代器操作,类似数组方法。
以前,操作迭代器需要自定义生成器函数。
1 | function* mapIterator(iter, mapper) { |
在 ES2025 中可以这样:
1 | const iter = [1, 2, 3][Symbol.iterator](); |
正则表达式增强
RegExp.escape()
动态拼接正则表达式时,用户输入中的特殊字符(如 *、$)常引发语法错误或安全漏洞。以往需手动编写转义函数:
1 | function escapeRegExp(string) { |
ES2025 新增原生方法 RegExp.escape(),一行代码即可安全转义,避免正则注入风险:
1 | const text = "Hello (World)"; |
正则表达式模式修饰符
ES2025 将允许在正则表达式中动态启用或禁用标志(如 i、m、s),使用语法如 (?i:pattern) 或 (?-i:pattern)。
以前,标志只能应用于整个正则表达式,无法局部控制。例如,匹配部分不区分大小写需要拆分正则或使用复杂技巧,这大大限制了复杂模式的表达能力。
在 ES2025 中可以这样:
1 | const regex = /^(?i:abc)def(?-i:ghi)$/; |
重复命名捕获组
ES2025 将允许在正则表达式的不同分支中使用相同的命名捕获组名称,只要这些组不会同时匹配。例如,(?
以前,命名捕获组必须唯一,导致匹配不同格式时需要使用不同组名。在访问结果时需额外逻辑判断,复杂且冗长,限制了正则表达式的灵活性。
1 | const regex = /^(?<year>\d{4})-(?<month>\d{2})|(?<year2>\d{4})\/(?<month2>\d{2})$/; |
在 ES2025 中可以这样:
1 | const regex = /^(?<year>\d{4})-(?<month>\d{2})|(?<year>\d{4})\/(?<month>\d{2})$/; |
集合和模块更新
新的 Set 方法
为内置 Set 类添加新方法,如 union(并集)、intersection(交集)、difference(差集)等,提升集合操作的便利性。
1 | const setA = new Set([1, 2, 3]); |
JSON 模块
ES2205 将允许直接导入 JSON 文件,语法:import … with { type: ‘json’ };。
以前,导入 JSON 需要借助 fetch 或 fs来实现:
1 | fetch('./config.json') |
在 ES2025 中可以这样:
1 | import config from './config.json' with { type: 'json' }; |
导入属性
在 import 中添加属性,使用 with 指定模块类型,如 with { type: ‘json’ };。
以前,模块类型由扩展名推断,可能导致安全问题。
1 | const config = require('./config.json'); |
在 ES2025 中可以这样:
1 | import config from './config.json' with { type: 'json' }; |
TypedArray 增强
Float16Array
添加 Float16Array TypedArray 和相关方法,支持 16 位浮点数。
以前,JavaScript 只支持 32 位和 64 位浮点数,16 位浮点数需库支持,效率较低。
1 | const float16 = require('@petamoriken/float16'); |
在 ES2025 中可以这样:
1 | const arr = new Float16Array([1.0, 2.3, 3.4]); |
不过,Float16Array 主要用于图形和机器学习,可能在普通开发中影响有限。