Featured image of post ES2024 新功能:JavaScript 的新功能Featured image of post ES2024 新功能:JavaScript 的新功能

ES2024 新功能:JavaScript 的新功能

探索 ES2024 新功能,包括 groupBy、Promise.withResolvers、ArrayBuffer 传输、String 方法和 Atomics.waitAsync 以及采用时间表。

ECMAScript 2024 (ES15) 为 JavaScript 引入了几个期待已久的功能。本文通过实际示例和采用时间表指南介绍了新功能。

数组分组:Object.groupBy 和 Map.groupBy

最受欢迎的 JavaScript 功能之一终于到来了。 Object.groupByMap.groupBy 根据回调将数组元素划分为组:

const inventory = [
  { name: "asparagus", type: "vegetables", quantity: 5 },
  { name: "bananas", type: "fruit", quantity: 0 },
  { name: "goat", type: "meat", quantity: 23 },
];

const byType = Object.groupBy(inventory, ({ type }) => type);
// { vegetables: [{ name: "asparagus", ... }],
//   fruit: [{ name: "bananas", ... }],
//   meat: [{ name: "goat", ... }] }

Map.groupBy 保留非字符串键,使其非常适合按对象或符号进行分组。这消除了对外部库或手动 reduce 模式的需要。

Promise.withResolvers

Promise.withResolvers() 返回一个 Promise 及其解析和拒绝函数作为属性,从而无需在构造函数外部声明变量:

const { promise, resolve, reject } = Promise.withResolvers();

// Outside the constructor scope
setTimeout(() => resolve("done"), 1000);
await promise; // "done"

此模式简化了将基于回调的 API 转换为 Promise、管理事件处理程序中的 Promise 生命周期以及实现自定义异步原语。


ArrayBuffer.prototype.transfer

transfertransferToFixedLength 方法支持缓冲区之间的零拷贝所有权转移:

const buffer = new ArrayBuffer(1024);
const view = new Uint8Array(buffer);
view[0] = 42;

const transferred = buffer.transfer();
// buffer.byteLength === 0 (detached)
// transferred.byteLength === 1024

这一性能关键型功能通过消除内存副本和减少 GC 压力,有利于 WebAssembly 运行时、Web Worker 通信和缓冲池管理。

字符串:isWellFormed 和 toWellFormed

这些方法解决了 Unicode 格式良好的问题。包含单独代理的格式错误的字符串可能会导致安全漏洞和渲染问题:

const str = "ab\uD800c";
str.isWellFormed(); // false
str.toWellFormed(); // "ab\ufffdc"

const clean = "hello";
clean.isWellFormed(); // true

对于用户生成的内容、国际化管道以及任何处理不受信任的文本输入的系统至关重要。


原子.waitAsync

Atomics.waitAsync 基于同步(和阻塞)Atomics.wait 构建,为共享内存同步提供非阻塞 API:

const sab = new SharedArrayBuffer(4);
const int32 = new Int32Array(sab);
Atomics.store(int32, 0, 0);

const { async, value } = Atomics.waitAsync(int32, 0, 0);
// { async: true, value: Promise<"ok" | "not-equal" | "timed-out"> }

这可以实现无锁数据结构、高效的跨线程同步以及实时数据处理,而不会阻塞主线程。

采用时间表

时间表可用性
0-6个月Chrome、Firefox Nightly、Node.js (–harmony)
6-12 个月Node.js LTS 在主要浏览器中稳定
12-18 个月Polyfill 可用,早期生产采用
18-24 个月广泛使用、TypeScript 支持、ESLint 规则

其他值得注意的补充

ES2024 还包括用于改进字符类操作的 RegExp.prototype.unicodeSets 标志(v 标志)、可调整大小的 ArrayBuffer 支持,以及通过 Error 上的 cause 属性标准化错误原因链。

结论

ES2024 提供了实用的改进,可以满足开发人员的日常需求。数组分组简化了数据转换,Promise.withResolvers 清理了异步模式,ArrayBuffer 传输解锁了新的性能可能性。今天就开始通过 polyfill 进行试验,并为本地支持做好准备,因为浏览器全年都会采用这些功能。