ECMAScript 2025最硬核新功能盘点大解析

banq


ECMAScript 2025 来了!JavaScript 又双叒叕升级啦!

就在2025年6月,JavaScript 的“祖宗级大会”——第129届ECMAScript 全体代表大会隆重召开!

会上,大佬们一拍桌子:“ECMAScript 2025 正式通过!”  意思是:JavaScript 又!升!级!了!

这就像你的手机系统从 iOS 17 升到 iOS 18,只不过这次是 JS(JavaScript)穿上了新裤子,走路都带风!

今天我们就来扒一扒,这波更新到底加了哪些“神仙功能”,让你写代码时少掉几根头发。

## 1. 迭代器助手(Iterator Helpers)——给“懒人”送福利!

先问你一个问题:你有没有见过那种只说不做、光想不干的人?

JavaScript 的“迭代器”(Iterator)就是这种人。

它能一个一个吐数据,但不像数组那样有

.map()
.filter()
这种“快捷键”,搞得程序员很头疼:

> 想对它加工?行啊,但你得先把它变成数组,或者手动写个

for
循环,累死你!

这就好比你想让一个宅男出门跑步,结果他非要先洗澡、换衣服、发朋友圈、拍vlog……最后干脆躺下说:“我不去了。”

ECMAScript 2025 看不下去了,怒吼一声:
> “你们这些迭代器,不能再这么懒了!给你们配个‘助手团’!”

于是,迭代器喜提以下新技能:

| 方法 | 功能 | 类比 |
|------|------|------|
|
.map()
| 给每个元素加工一下 | 像美颜相机一键磨皮 |
|
.filter()
| 把不符合条件的踢出去 | 相亲节目“你过不了我这关!” |
|
.take(5)
| 只拿前5个 | 抢限量款球鞋,只抢5双 |
|
.drop(3)
| 前3个不要,从第4个开始 | “前面仨太丑,跳过!” |
|
.flatMap()
| 扁平化+映射 | 把俄罗斯套娃一层层打开再拍照 |
|
.reduce()
| 累加器,一路算到底 | 像班主任统计全班零花钱总和 |
|
.toArray()
| 懒人变勤快人,转成数组 | 宅男终于出门了! |
|
.forEach()
| 一个个遍历 | 老师点名:“张三!李四!王五!” |
|
.some()
| 有人符合就行 | “班里有没有人带零食?” |
|
.every()
| 必须全员达标 | “所有人作业交了吗?” |
|
.find()
| 找第一个匹配的 | “谁偷吃了我的辣条?” |

原话:ECMAScript 2025 在迭代器上添加了新方法, 以允许迭代器的一般使用和消耗。

  1. map() - 允许用户将函数应用于迭代器返回的每个元素
  2. filter() - 允许用户跳过迭代器中未通过过滤函数的值
  3. take() - 返回一个迭代器,其中包含原始迭代器中的项目,从 0 到限制
  4. drop() - 返回限制之后的项目的迭代器
  5. flatMap() - 返回平面值的迭代器
  6. reduce() - 允许用户将函数应用于迭代器返回的每个元素,同时跟踪 reducer 的最新结果
  7. toArray() - 返回包含迭代器值的数组
  8. forEach() - 允许循环迭代器
  9. some() - 检查迭代器中的任何值是否与给定的谓词匹配,
  10. every() - 检查迭代器生成的每个值是否都通过测试函数
  11. find() - 查找迭代器中匹配的第一个元素。
  12. Iterator.from() - 从迭代器或可迭代对象创建新迭代器对象的静态方法

还新增了一个“造人术”:

js
Iterator.from([1, 2, 3]) // 把数组变成迭代器

> 相当于说:“你,去当个打工人!”

总结一句话:以前迭代器像咸鱼,现在它终于能打工了!

## 2. Set 集合新技能——数学课白上了?Set 来教你!

还记得中学数学里的集合运算吗?

  • 并集 ∪
  • 交集 ∩
  • 差集 \
  • 对称差集 ⊕

以前 JS 的

Set
就像个只会存数据的傻白甜,想算个并集?不好意思,自己写函数!

现在 ECMAScript 2025 说:
> “Set 也是有尊严的!给它配上数学武器!”

直接上代码,看有多爽:

js
const A = new Set([1, 2, 3]);
const B = new Set([3, 4, 5]);

A.union(B);               // {1,2,3,4,5} —— 全部都要!
A.intersection(B);        // {3} —— 只留共同爱好
A.difference(B);          // {1,2} —— A有B没有的
A.symmetricDifference(B); // {1,2,4,5} —— 各自独有的凑一起
A.isSubsetOf(B);          // false —— A是B的小弟吗?不是!
A.isSupersetOf(B);        // false —— A能罩着B吗?也不能!
A.isDisjointFrom(B);      // false —— 有交集吗?有!那个3!

这下好了,以后数学老师问:“交集怎么算?”  
你可以骄傲地说:
> “老师,我用 JS 的

.intersection()
就搞定了!”


## 3. JSON 模块导入——终于能直接“吃” JSON 了!

以前你在 JS 里想导入一个

config.json
文件,浏览器会一脸懵:
> “啥?JSON?不认识!滚去用 Webpack 打包!”

于是你只能靠“第三方帮派”(比如 webpack、vite)帮你把 JSON 变成 JS 才能用。

现在 ECMAScript 2025 大手一挥:
> “原生支持!以后谁还不让 JS 直接 import JSON,我找他聊聊!”

新语法来了:

js
import config from './config.json' with { type: 'json' };

或者动态导入:

js
const jsonConfig = await import('./config.json', { with: { type: 'json' } });

甚至还能导出:

js
export { version } from './package.json' with { type: 'json' };

这就像以前你吃火锅得自己买菜洗菜切菜煮锅底,现在直接点个“外卖火锅全家桶”,连电磁炉都给你配好了!


## 4. RegExp.escape()——终于不用手动“转义”了!

你有没有遇到过这种情况?

你想把字符串

'file.'
当成普通文本去替换,结果正则表达式把它当成了:
> “以 file 开头,后面跟任意一个字符”

所以

'file.txt'
是匹配了,但
'files'
也被误伤了!

为啥?因为

.
在正则里是“通配符”,不是“小数点”。

以前你要自己写个函数来“转义”特殊字符,比如把

.
变成
\.
*
变成
\*
……

写完之后你自己都看不懂自己写的啥。

现在 ECMAScript 2025 给你送了个“防坑神器”:

js
RegExp.escape('file.txt') // 返回 'file\.txt'

一行代码,天下太平!

冷知识:这个功能,早在15年前就被提出来了……
> 意思是:程序员们为此痛苦了整整15年,现在才解决。

建议把这个方法改名叫:
>

RegExp.thanksForWaiting15Years()

## 5. 正则表达式局部修饰符——精准控制大小写!

以前正则的标志位(flag)像广播喇叭:
>

/i
一开,整个正则都变成不区分大小写。

但现在 ECMAScript 2025 支持“局部静音”或“局部喊话”了!

比如我想让“blogs”不区分大小写,但“Saeloun”必须大写 S:

js
/^(?i:blogs) by Saeloun$/

解释一下:
-

(?i:blogs)
:只对
blogs
开启忽略大小写
-
Saeloun
:保持原样,必须大写 S

测试结果:

js
"blogs by Saeloun" → ✅ 匹配  
"Blogs by Saeloun" → ✅ 匹配  
"bloGs by Saeloun" → ✅ 匹配  
"blogs by saeloun" → ❌ 不匹配!Saeloun 必须大写!

这就像班级里老师说:
> “张三你可以小声说话,但李四你给我闭嘴!”

精准控制,绝不误伤!

## 6. Promise.try()——拯救同步异常的英雄!

Promise 是异步世界的王者,但它有个致命弱点:

> 如果一个函数同步抛错

Promise.resolve(func())
根本来不及救它,错误就直接炸了!

举个栗子:

js
function syncThrows() {
  throw new Error("我当场去世!");
}

Promise.resolve(syncThrows()) // 错误在 resolve 之前就爆炸了!

你会看到浏览器红字警告:
> Uncaught Error: 我当场去世!

为了解决这个问题,程序员们想尽办法:

  • .then()
    包一层?✅ 能捕获,但延迟执行(下个事件循环)
  • new Promise(resolve => resolve(func()))
    ?✅ 能同步执行,但写起来像绕口令

现在 ECMAScript 2025 推出终极解决方案:

js
Promise.try(() => syncReturns())     // 同步返回 → 成功
Promise.try(() => syncThrows())      // 同步报错 → 被 catch 捕获
Promise.try(() => asyncReturns())    // 异步返回 → 照样处理

一句话总结:
>

Promise.try()
就像一个全能保镖,不管你是当场去世、慢慢发病,还是假装健康,它都能把你安全送到
.then()
.catch()
手里。

## 7. Float16Array——专治“内存不够用”!

最后压轴登场的是:Float16Array

你可能知道 JS 有:
-

Float32Array
(32位浮点数)
-
Float64Array
(64位,精度高,占内存)

但现在新增了:
>

Float16Array
—— 半精度浮点数!

它只有16位,精度低一点,但省空间啊!

特别适合:
- 游戏开发
- AI 推理
- GPU 计算
- 手机端轻量化应用

还配套增加了:

js
dataView.getFloat16(offset)
dataView.setFloat16(offset, value)

这就像以前你拍照用 4K 高清,占内存太大;现在出了“高清省流模式”,画质够用,手机不卡!

## 总结:ECMAScript 2025 到底强在哪?

| 特性 | 人话理解版 |
|------|-------------|
| Iterator Helpers | 迭代器终于学会打工了 |
| 新 Set 方法 | 数学课知识终于能变现了 |
| JSON 模块 | 终于能直接吃 JSON 了 |
| RegExp.escape | 再也不怕点号变通配符 |
| 正则局部修饰符 | 精准打击,不误伤队友 |
| Promise.try | 同步异步通吃,稳如老狗 |
| Float16Array | 节省内存,手机党狂喜 |