TC39 提出了九个 JavaScript 建议,包括 Array.fromAsync、Error.isError 和 using

  • 2025-06-24
    北京
  • 本文字数:1212 字

    阅读完需:约 4 分钟

Ecma 技术委员会 39(TC39),负责 JavaScript(ECMAScript)发展的机构,最近在其阶段流程中推进了九个提案,其中有三个新的语言特性将成为标准的一部分:Array.fromAsync、Error.isError 和显式资源管理 using

 

Array.fromAsync 是一个从异步可迭代对象创建数组的实用工具。这简化了从异步生成器或流等数据源收集数据的过程,消除了手动使用 for await...of 循环的需要。

 

特性解释器提供了以下来自httptransfer模块的实际示例:

 

async function toArray(items) {  const result = [];  for await (const item of items) {    result.push(item);  }  return result;}it('empty-pipeline', async () => {  const pipeline = new Pipeline();  const result = await toArray(    pipeline.execute(      [ 1, 2, 3, 4, 5 ]));  assert.deepStrictEqual(    result,    [ 1, 2, 3, 4, 5 ],  );});
复制代码

 

使用新语法,这变为:

 

it('empty-pipeline', async () => {  const pipeline = new Pipeline();  const result = await Array.fromAsync(    pipeline.execute(      [ 1, 2, 3, 4, 5 ]));  assert.deepStrictEqual(    result,    [ 1, 2, 3, 4, 5 ],  );});
复制代码

 

Error.isError() 方法也推进到第 4 阶段,提供了一种可靠的方法来检查一个值是否是错误实例。替代方案 instanceof Error 被认为是不可靠的,因为它会在跨域(例如,来自 iframe 或 node 的 vm 模块)错误实例中提供Error的否定结果。

 

另一个达到第 4 阶段的提案是显式资源管理,引入了用于管理需要显式清理的资源(如文件或网络连接)的 using 声明。这个提案特别受到资源管理不一致模式的驱动:ECMAScript 迭代器的 iterator.return() 、WHATWG 流读取器的 reader.releaseLock() 、NodeJS 文件句柄的 handle.close() 等。

 

提案还缓解了几个潜在的问题。例如,在管理多个资源时:

 

const a = ...;const b = ...;try {  ...}finally {  a.close(); // 糟糕,如果`b.c close()`依赖于`a`,就会发生问题。  b.close(); // 糟糕,如果`a.c close()`抛出异常,`b`永远不会执行。}
复制代码

 

Import Attributes (原名 Import Assertions)推进到第 3 阶段。这个特性允许开发者向import声明添加元数据,提供关于模块预期类型的信息,如 JSON 或 CSS。

 

其他在不同阶段推进的提案包括 Promise.try ,旨在简化 promise 链中的错误处理, RegExp.escape 用于在正则表达式中安全转义字符串等。开发者可以在网上的博客文章中查看完整列表

 

TC39 是发展 JavaScript 的委员会。其成员包括所有主要的浏览器供应商等。每个 ECMAScript 特性的提案都会经历以下几个成熟的阶段

 

  • 第 0 阶段:初步构想

  • 第 1 阶段:提案

  • 第 2 阶段:草案

  • 第 3 阶段:候选

  • 第 4 阶段:完成

 

一旦一个特性的提案达到第 4 阶段,它将被包含在标准中,因此可以安全使用。然而,浏览器对特性的支持可能会落后于标准中特性的采用。

 

原文链接:

https://www.infoq.com/news/2025/06/tc39-stage-4-2025/