聊聊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`,则更适合特定场景,建议根据实际需求和目标环境谨慎引入。新特性不必全追,但选对几个,确实能让代码更干净。
转载请注明出处,版权归原作者所有。
管理员
黑卡会员



