跳至主内容

7.6.0 发布:私有静态访问器与 V8 内部函数语法

· 1 分钟阅读
非官方测试版翻译

本页面由 PageTurner AI 翻译(测试版)。未经项目官方认可。 发现错误? 报告问题 →

我们刚刚发布了 Babel 的新次要版本!

本次更新包含对类中静态私有访问器的支持,以及对 V8 内部函数语法的解析器支持。我们还修复了与 TDZ(暂时性死区)处理相关的一系列长期存在的问题,并增强了对 do 表达式的支持。您可以在 GitHub 上查看完整更新日志。

感谢以下开发者提交的首个 PR:Serhii MuryhinAshwin RamaswamiSungmin LeeSerge HavasZiad El Khoury HannaEven AlanderShrey BangaDylan KirkbyAjay SagarAdam RambergBin Xin!(同时感谢 🤖 Codetriage README Botdependabot

Bloomberg 持续赞助 Babel 新类特性的实现:继贡献了多项类新特性(静态私有字段私有实例方法私有实例访问器 以及 静态私有方法)后,他们刚刚实现了静态私有 getter 和 setter。

同时特别致谢 Frontend Masters 在过去一个月进行了两笔重要捐赠,也感谢所有 其他赞助者 让 Babel 团队能投入更多时间到项目中!

如果您或您的公司希望支持 Babel 和 JavaScript 的演进但不确定具体方式,可以通过 OpenCollective 进行捐赠。更棒的是,直接参与 新 ECMAScript 提案 的实现工作!作为志愿者驱动的项目,我们依赖社区支持来资助维护广大 JavaScript 用户生态的工作,并对代码实现负责。如有意向合作,请通过 henry@babeljs.io 联系 Henry!

私有静态访问器(getter 和 setter)(#10217)

JavaScript
class Resource {
static #loaderInstance = null;

static get #loader() {
if (!this.#loaderInstance) this.#loaderInstance = new Loader();
return this.#loaderInstance;
}

status = null;

constructor(url) {
this.status = Resource.#loader.load(url);
}
}

感谢 Tim(来自 Bloomberg)实现该提案!

您可以通过在配置中添加 @babel/plugin-proposal-private-methods(若尚未添加),或在在线 REPL 中启用 stage-3 预设来测试此新功能。

类的私有特性支持终于完整了 🎉

Class PrivateInstanceStatic
Fields
class A { #a = 1 }
7.0.07.1.0
Methods
class A { #a() {} }
7.2.07.4.0
Accessors
class A { get #a() {} }
7.3.07.6.0

It's time to party!

V8 内部运行时函数解析 (#10148)

注意

这是对 JavaScript 语言的非标准扩展,只能在 V8 引擎中通过启用 --allow-natives-syntax 命令行标志使用。

V8(Node.js 和基于 Chromium 的浏览器使用的 JavaScript 引擎)能够将各种内部功能作为 JavaScript 函数公开。虽然这些 API 绝不能在生产环境的 JavaScript 代码中使用,但这些特殊函数在测试和调试场景中非常有用——例如,可用于理解 JavaScript 值在内存中的表示方式,或直接调用某些 ECMAScript 规范例程。

这些所谓的 "V8 内部函数" 具有与普通函数不同的语法:它们的名称总是以 % 开头。此外,它们只能被直接调用,不能作为普通值使用(例如,不能将它们赋值给其他变量)。

JavaScript
function fn() { /* ... */ }

const status = %GetOptimizationStatus(fn);

if (status === 2) {
console.log("The function is not optimized!");
}

完整的 V8 内部函数列表可在 V8 源代码 中找到。

要在 @babel/parser 中启用此语法,可使用 v8intrinsic 插件:

JavaScript
const { parse } = require("@babel/parser");

parse(code, {
plugins: ["v8intrinsic"]
})

空值合并运算符 (??) 更新 (#10269)

空值合并运算符的 Stage 3 提案最近进行了更新:为避免与其他逻辑运算符 (&&||) 的优先级混淆,规范已更改为禁止混合使用这些运算符。

这意味着以下表达式现在无效:

JavaScript
a ?? b || c;
a && b ?? c;

相反,你应该在适当的地方添加括号:

JavaScript
(a ?? b) || c; /* or */ a ?? (b || c);
(a && b) ?? c; /* or */ a && (b ?? c);

这与一元减号 (-) 和幂运算符 (**) 的交互方式类似:你不能写 -1 ** 2,而必须在 (-1) ** 2-(1 ** 2) 之间做出选择。