ES2024至ES2026阶段特性总结,包括Object.groupBy、Array.findLast等,每个特性均配简单示例,可直接用于日常开发。
JavaScript 每年都在演进,2026 年也不例外。伴随着 ES2024、ES2025 以及 ES2026 正在落地的新特性,这门语言悄然积累了一系列工具,抹平了开发者多年来手写的大量变通方案。
如果你还在用 reduce 分组数组、写繁琐的日期运算、或者用别扭的回调模式包装 Promise,这些新特性将真正改变你写代码的方式。有些解决了从 JavaScript 早期就开始被开发者吐槽的问题;有些则直接消除了在各个代码库里被反复复制粘贴的模板代码。
以下是 10 个值得现在就学起来的新特性,每个都附有简单的示例。
数据分组曾经意味着要写一个 reduce 函数,或者用累加器写一个手动循环。现在只需要一个内置方法就能搞定。
const orders = [
{ status: "shipped", id: 1 },
{ status: "pending", id: 2 },
{ status: "shipped", id: 3 },
];
const grouped = Object.groupBy(orders, order => order.status);
这一行代码就替换掉了开发者重复写了成千上万次的模式。如果你需要 key 保持为实际的对象而不是字符串,就用 Map.groupBy——当你的分组 key 不能轻易转为纯字符串、或者转了会丢失信息时,这就派上用场了。
手动创建一个 Promise 并从中取出 resolve 和 reject 函数,曾经需要一个很别扭的变通方案:在 Promise 构造函数外部声明变量。Promise.withResolvers 完全解决了这个问题。
const { promise, resolve, reject } = Promise.withResolvers();
在构建自定义的基于事件的 API 时特别有用——你需要在 Promise 原始作用域之外的地方去 resolve 它。
把一个 async iterable 转成数组,曾经需要写一个手动循环加 push 调用。Array.fromAsync 一行代码就搞定了,而且它和 async generators 以及 async iterables 配合得非常好。
const results = await Array.fromAsync(asyncGenerator());
如果你处理流数据、分页 API 或 async generators,这个小改动能省下惊人的模板代码量。
包含未配对代理字符的字符串一直以来是 Bug 的安静来源,尤其在向要求严格合法 Unicode 的 API 发送数据时更是如此。isWellFormed 和 toWellFormed 终于给开发者提供了一个原生的检查和修复方式。
const cleaned = userInput.isWellFormed() ? userInput : userInput.toWellFormed();
这件事的影响比听起来大得多,尤其对于处理用户生成文本、emoji 或者多语言输入的应用来说。
处理 Unicode 的正则表达式一直比它本来应该的更棘手。新的 v 标志在旧的 u 标志基础上扩展了对集合操作、字符类并集、以及更可预测的 Unicode 属性匹配的支持。
const regex = /[\p{Letter}]/v;
如果你的应用处理多种语言或文字体系的文本,这个标志让你的正则行为明显更可靠。
多年来,操作迭代器意味着先把它们转成数组,才能用 map、filter 这些熟悉的方法。Iterator helpers 把这些链式方法直接带到了迭代器本身。
const result = someIterator
.map(x => x * 2)
.filter(x => x > 10)
.take(5);
这对于惰性求值尤其强大,让你能够处理大型甚至无限的序列,而无需一次性把全部数据加载到内存中。如果你之前用过 generator functions,现在用起来会感觉日常代码里写它们舒服多了,而不再是专属于高级边缘场景的东西。
JavaScript 的 Set 对象终于有了开发者们期盼多年的方法:union、intersection、difference、symmetricDifference 等等。再也不用手动把 Set 转成数组来比较了。
const combined = setA.union(setB);
const shared = setA.intersection(setB);
如果曾经写过辅助函数来比较两个 Set,这个特性悄无声息地就替代了它。这些操作出现得比初看时更频繁,尤其在权限系统、标签过滤、或者比较数据集前后状态时。
处理可能同步抛出异常也可能返回 Promise 的函数,以前需要用别扭的 try-catch 把 Promise 链包起来。Promise.try 把两种情况统一成了一种一致的写法。
Promise.try(() => riskyFunction())
.then(result => console.log(result))
.catch(error => console.error(error));
当你不确定一个函数是同步还是异步时,这个小改动让错误处理变得可预测得多。
管理数据库连接、文件句柄或锁这类资源,一直依赖 try-finally 块,既容易忘记又容易写错。新的 using 和 await using 关键字把确定性清理直接带入了语言层面。
{
using connection = openConnection();
// 当这个代码块结束时,connection 自动关闭
}
这是 JavaScript 历史上被请求最多的特性之一,它真正改变了资源密集型代码的编写和评审方式。C# 和 Python 多年前就有类似的模式了,JavaScript 开发者为了同样的问题构建变通方案的时间也一样长。把它直接内置到语言里,消除了一整类曾经在代码审查中漏过去的资源泄漏 Bug。
JavaScript 的日期处理几十年来一直以痛苦著称。时区 Bug、可变的 Date 对象、以及令人困惑的月份索引,都是反复出现的心头痛。Temporal 是众望所归的替代品,专门为在语言层面解决这些问题而构建。
const date = Temporal.PlainDate.from("2026-06-15");
const later = date.add({ days: 30 });
Temporal 对象是不可变的、天生带时区的,而且比旧的 Date 对象直觉得多。不再需要猜测一个日期操作是否会修改原始对象——Temporal 永远返回一个新值,这就消除了一整类微妙的 Bug。现在学习它能让你走在曲线前面,等它成为各地的标准实践时你就准备好了。
这些特性没有一个是为了语法而语法。每一条都解决了一个真实的、反复出现的实际问题,开发者们多年来一直在用额外的依赖包或者手写的工具函数来绕过这些问题。
学习它们意味着写更少的代码、引入更少的 Bug,花更少的时间维护那些语言现在已经原生处理的变通方案。也意味着更容易读懂别人的现代代码,因为这些模式正在成为代码库、教程和面试中的新常态。
这里还有一个实际的职业角度。面试官和资深开发者越来越看重对这些特性的熟悉程度,尤其是在已经现代化的代码库里。在语言基础方面落伍,是开发者被团队更新后的标准甩在后面的方式之一。
我需要升级浏览器或运行时来使用这些特性吗?
是的,对大部分特性来说都需要。像 Iterator helpers 和 Set 方法已经在现代浏览器和 Node 22 及以上版本中得到广泛支持,而像 Temporal 和显式资源管理这些更新的特性仍在逐步落地,可能暂时需要 polyfill。
这些特性现在在生产环境里用安全吗?
已经定稿的 ES2024 和 ES2025 特性在现代环境中通常是安全的。任何仍在随 ES2026 落地中的特性,在生产环境依赖它之前,建议对照你具体的浏览器和运行时支持情况检查一下。
我需要用 bundler 或 transpiler 吗?
对于老版本浏览器或特定运行时版本来说,是的,Babel 等工具可以提供帮助。对于现代 Node.js 版本和当前浏览器,其中很多特性可以直接原生使用,不需要任何额外工具。
我应该先学哪一个?
Object.groupBy、Iterator helpers 和 Promise.withResolvers 是最容易立即采用的,而且往往替代了开发者日常已经在反复书写的最常见的变通方案。
学 Temporal 值不值,如果它还在落地中的话?
值。日期处理 Bug 极其常见,现在就熟悉 Temporal 意味着等它的支持普及之后,你能自信地使用它。
2026 年的 JavaScript 和仅仅几年前相比已经明显不同了,不是因为语法发生了巨大变化,而是因为这么多日常痛点终于有了干净、原生的解决方案。从分组数据和管理资源,到无惧地处理日期,这 10 个特性悄无声息地让你的代码更短、更安全、更易维护。
你不需要一下子全部采用。从解决你当前正在绕路的问题的那一个开始,其余的会随着你的项目和运行时支持的跟进而自然跟上。
学习它们不仅仅是为了跟上时代,而是为了用更少的力气写出更好的代码——这正是让你成为更强开发者的方式。