聊聊ES2024新特性:哪些值得现在就在项目中使用?
ES2024(ECMAScript 2024)已经正式定稿一段时间了,但很多团队的项目还停留在 ES2018/ES2020 的语法舒适区里。新特性年年有,真正值得立刻上手的却不多。有些是语法糖,有些是解决长期痛点的 API,还有些虽然强大,但受限于运行时支持,只能先观望。
这篇文章不打算把 ES2024 的提案清单从头念到尾,而是从实际项目出发,聊聊哪些特性可以现在就用、哪些需要再等等。
Object.groupBy 和 Map.groupBy:手写分组逻辑可以退休了
以前要把数组按某个字段分组,通常得写一个 reduce 或 for 循环,手动判断 key 是否存在。ES2024 带来了 Object.groupBy 和 Map.groupBy 两个静态方法。
const people = [
{ name: 'Alice', age: 25 },
{ name: 'Bob', age: 30 },
{ name: 'Carol', age: 25 },
];
const byAge = Object.groupBy(people, (p) => p.age);
// { 25: [...], 30: [...] }
注意 Object.groupBy 返回的是一个 null 原型对象,所以不能直接调用 byAge.hasOwnProperty。如果需要更复杂的 key 类型(比如对象),用 Map.groupBy 更合适。这个特性在 Chrome 117+、Node 21+ 已经可用,配合 core-js 也能在旧环境跑,很适合现在引入。
Promise.withResolvers:告别手写外部 resolve
如果你写过“把 resolve 和 reject 保存到外部变量”的代码,就知道有多啰嗦。Promise.withResolvers 直接把这三件套打包返回:
const { promise, resolve, reject } = Promise.withResolvers();
setTimeout(() => resolve('done'), 1000);
await promise;
它特别适合封装事件、超时控制,或者把回调式 API 转成 Promise。这个 API 的 polyfill 非常简单,几乎零成本,推荐现在就加进工具函数里。
String.prototype.isWellFormed / toWellFormed:Unicode 卫生检查
处理用户输入或网络数据时,偶尔会遇到“孤立代理项”(lone surrogate)导致的编码问题。ES2024 新增了两个字符串方法:
isWellFormed()判断字符串是否是合法的 UTF-16;toWellFormed()把非法代理项替换成 U+FFFD。
const bad = '\uD800';
bad.isWellFormed(); // false
bad.toWellFormed(); // '\uFFFD'
如果你做文本处理、URL 解析或表单校验,这两个方法能省掉不少正则和 try-catch。支持度也不错,值得添加到工具库。
RegExp v 标志与 ArrayBuffer 调整:强大但要看环境
RegExp 的 v 标志(unicodeSets)支持集合运算和更精细的 Unicode 匹配,比如 [\p{Letter}--\p{ASCII}]。它很强大,但属于语法层面的特性,无法 polyfill,且旧版 Safari 和部分 Node 版本还不支持。如果项目不需要兼容旧环境,可以尝试;否则建议再等等。
ArrayBuffer 的可调整大小(resizable ArrayBuffer)和 transfer 方法,主要面向高性能场景,比如 Worker 之间转移内存、动态扩容缓冲区。这些特性同样无法 polyfill,且浏览器支持较新。除非你在做音视频、WebAssembly 或大数据处理,否则暂时不用急着上。
Atomics.waitAsync:小众但有用
Atomics.waitAsync 允许在 SharedArrayBuffer 上异步等待,解决了主线程不能使用 Atomics.wait 的问题。它适合多线程协调场景,但日常业务代码几乎用不到。知道有这回事即可。
小结
ES2024 的新特性里,Object.groupBy、Map.groupBy、Promise.withResolvers 和 String 的 Well-Formed 方法,是我认为最值得现在就在项目中使用的。它们解决的是高频痛点,polyfill 成本低,运行时支持也足够好。而 RegExp v 标志、ArrayBuffer 调整和 Atomics.waitAsync,则更适合特定场景,建议根据实际需求和目标环境谨慎引入。新特性不必全追,但选对几个,确实能让代码更干净。
转载请注明出处,版权归原作者所有。
正式会员
认证极客






