ECMAScript 标准每年都会发布新版本,ES2025(即 ECMAScript 2025)带来了一系列令人期待的新特性。这些提案已经进入 Stage 4 阶段,意味着它们已经确定成为标准的一部分。本文将逐一介绍这些重要新特性及其使用场景。
一、Set 方法:union、intersection、difference 等
长期以来,JavaScript 的 Set 只有基础的增删查操作,集合运算需要开发者手动实现。ES2025 为 Set 原型新增了七个方法,让集合运算变得简洁高效。
const frontend = new Set(['React', 'Vue', 'Angular', 'Svelte']);
const favorite = new Set(['React', 'Solid', 'Vue']);
// 并集:两个集合中所有元素
const union = frontend.union(favorite);
// Set {'React', 'Vue', 'Angular', 'Svelte', 'Solid'}
// 交集:两个集合的公共元素
const common = frontend.intersection(favorite);
// Set {'React', 'Vue'}
// 差集:在前端但不在喜爱列表中
const diff = frontend.difference(favorite);
// Set {'Angular', 'Svelte'}
// 对称差集:只存在于其中一个集合
const symDiff = frontend.symmetricDifference(favorite);
// Set {'Angular', 'Svelte', 'Solid'}
// 子集判断
frontend.isSubsetOf(new Set(['React', 'Vue', 'Angular', 'Svelte', 'jQuery']));
// true
// 超集判断
frontend.isSupersetOf(favorite); // false
frontend.isSupersetOf(new Set(['React', 'Vue'])); // true
// 互斥判断
frontend.isDisjointFrom(new Set(['jQuery', 'Backbone']));
// true(没有公共元素)
这些方法返回全新的 Set 实例,不会修改原始集合。它们让原本需要遍历和条件判断的代码浓缩为单个方法调用,可读性和性能都得到显著提升。
二、Iterator Helpers
Iterator Helpers 为所有迭代器(包括 Array、Map、Set 等的迭代器)提供了类似数组高阶方法的链式操作能力,但关键区别在于它们是惰性求值的。
function* naturalNumbers() {
let n = 1;
while (true) yield n++;
}
const result = naturalNumbers()
.filter(n => n % 2 === 0) // 只保留偶数
.map(n => n * n) // 求平方
.take(5) // 只取前 5 个
.toArray(); // 转为数组
console.log(result); // [4, 16, 36, 64, 100]
// 还支持 reduce、forEach、some、every、find
const hasBig = naturalNumbers()
.map(n => n * n)
.some(n => n > 1000);
// true(惰性求值,找到匹配项立即停止)
惰性求值意味着即使源是无限序列,配合 take() 也不会导致无限循环。这在处理大数据流或管道式数据变换时非常有用,避免了创建大量中间数组带来的内存开销。
三、Temporal API
Temporal 是对 JavaScript 日期时间处理的全面革新,旨在彻底替代存在诸多设计缺陷的 Date 对象。它提供了不可变的、时区感知的、国际化友好的日期时间类型。
// 获取当前时间(带时区信息)
const now = Temporal.Now.zonedDateTimeISO();
console.log(now.year, now.month, now.day); // 2026 5 8
console.log(now.hour, now.minute, now.second);
// 创建特定日期
const birthday = Temporal.PlainDate.from('2000-06-15');
const today = Temporal.Now.plainDateISO();
// 日期运算
const age = today.since(birthday, { smallestUnit: 'year' });
console.log(`年龄: ${age.years} 岁`);
// 时区转换
const tokyoTime = now.withTimeZone('Asia/Tokyo');
const nyTime = now.withTimeZone('America/New_York');
// 持续时间计算
const duration = Temporal.Duration.from({ hours: 2, minutes: 30 });
const later = now.add(duration);
// 格式化输出
const plain = Temporal.PlainDateTime.from('2026-05-08T14:30:00');
console.log(plain.toLocaleString('zh-CN', { dateStyle: 'full', timeStyle: 'short' }));
// "2026年5月8日星期五 14:30"
Temporal 的类型系统设计非常精密:PlainDate 不含时间,PlainTime 不含日期,ZonedDateTime 包含完整时区信息。这种明确的类型划分避免了 Date 对象中时区和 UTC 混淆的老问题。
四、Promise.try
Promise.try 是一个实用的简化方法,它将同步函数调用统一包装为 Promise,避免在 async 函数体内用 try-catch 包裹同步异常。
// 之前:需要手动包装同步异常
function fetchUserData(id) {
return new Promise((resolve, reject) => {
try {
const parsed = JSON.parse(id); // 可能抛出同步异常
resolve(fetch('/api/user/' + parsed));
} catch (e) {
reject(e);
}
});
}
// 现在:使用 Promise.try
function fetchUserData(id) {
return Promise.try(() => {
const parsed = JSON.parse(id);
return fetch('/api/user/' + parsed);
});
}
// 统一的错误处理链
Promise.try(() => JSON.parse(input))
.then(data => fetch('/api/' + data.id))
.then(res => res.json())
.catch(err => console.error('处理失败:', err.message));
五、正则表达式修饰符
ES2025 允许在正则表达式内部通过内联修饰符局部启用或禁用标志位,提升了正则表达式在复杂场景下的灵活性。
// 在正则内部局部启用忽略大小写
const re = /hello(?i: world)/;
console.log(re.test('hello WORLD')); // true
console.log(re.test('HELLO world')); // false(hello 部分不忽略大小写)
// 局部禁用 s(dotAll)标志
const re2 = /(?-s:a.b)/s;
// 整个正则启用 dotAll,但 a.b 组内禁用,"." 不匹配换行
总结
ES2025 的这些特性覆盖了集合运算、迭代器处理、日期时间、异步编程和正则表达式等多个方面。Set 方法和 Iterator Helpers 让数据处理代码更加简洁,Temporal API 解决了长期以来的日期处理痛点,Promise.try 简化了同步异常的异步包装。建议在项目中逐步引入这些新特性,配合 Babel 或 TypeScript 的最新版本确保兼容性。