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 看不下去了,怒吼一声:
> “你们这些迭代器,不能再这么懒了!给你们配个‘助手团’!”
于是,迭代器喜提以下新技能:
| 方法 | 功能 | 类比 | |
原话:ECMAScript 2025 在迭代器上添加了新方法, 以允许迭代器的一般使用和消耗。
- map() - 允许用户将函数应用于迭代器返回的每个元素
- filter() - 允许用户跳过迭代器中未通过过滤函数的值
- take() - 返回一个迭代器,其中包含原始迭代器中的项目,从 0 到限制
- drop() - 返回限制之后的项目的迭代器
- flatMap() - 返回平面值的迭代器
- reduce() - 允许用户将函数应用于迭代器返回的每个元素,同时跟踪 reducer 的最新结果
- toArray() - 返回包含迭代器值的数组
- forEach() - 允许循环迭代器
- some() - 检查迭代器中的任何值是否与给定的谓词匹配,
- every() - 检查迭代器生成的每个值是否都通过测试函数
- find() - 查找迭代器中匹配的第一个元素。
- 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 到底强在哪?
| 特性 | 人话理解版 | |