7.6.0 发布:私有静态访问器与 V8 内部函数语法
本页面由 PageTurner AI 翻译(测试版)。未经项目官方认可。 发现错误? 报告问题 →
我们刚刚发布了 Babel 的新次要版本!
本次更新包含对类中静态私有访问器的支持,以及对 V8 内部函数语法的解析器支持。我们还修复了与 TDZ(暂时性死区)处理相关的一系列长期存在的问题,并增强了对 do 表达式的支持。您可以在 GitHub 上查看完整更新日志。
感谢以下开发者提交的首个 PR:Serhii Muryhin、Ashwin Ramaswami、Sungmin Lee、Serge Havas、Ziad El Khoury Hanna、Even Alander、Shrey Banga、Dylan Kirkby、Ajay Sagar、Adam Ramberg 和 Bin Xin!(同时感谢 🤖 Codetriage README Bot 和 dependabot)
Bloomberg 持续赞助 Babel 新类特性的实现:继贡献了多项类新特性(静态私有字段、私有实例方法、私有实例访问器 以及 静态私有方法)后,他们刚刚实现了静态私有 getter 和 setter。
同时特别致谢 Frontend Masters 在过去一个月进行了两笔重要捐赠,也感谢所有 其他赞助者 让 Babel 团队能投入更多时间到项目中!
如果您或您的公司希望支持 Babel 和 JavaScript 的演进但不确定具体方式,可以通过 OpenCollective 进行捐赠。更棒的是,直接参与 新 ECMAScript 提案 的实现工作!作为志愿者驱动的项目,我们依赖社区支持来资助维护广大 JavaScript 用户生态的工作,并对代码实现负责。如有意向合作,请通过 henry@babeljs.io 联系 Henry!
私有静态访问器(getter 和 setter)(#10217)
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 Private | Instance | Static |
|---|---|---|
Fields class A { #a = 1 } | 7.0.0 | 7.1.0 |
Methods class A { #a() {} } | 7.2.0 | 7.4.0 |
Accessors class A { get #a() {} } | 7.3.0 | 7.6.0 |

V8 内部运行时函数解析 (#10148)
这是对 JavaScript 语言的非标准扩展,只能在 V8 引擎中通过启用 --allow-natives-syntax 命令行标志使用。
V8(Node.js 和基于 Chromium 的浏览器使用的 JavaScript 引擎)能够将各种内部功能作为 JavaScript 函数公开。虽然这些 API 绝不能在生产环境的 JavaScript 代码中使用,但这些特殊函数在测试和调试场景中非常有用——例如,可用于理解 JavaScript 值在内存中的表示方式,或直接调用某些 ECMAScript 规范例程。
这些所谓的 "V8 内部函数" 具有与普通函数不同的语法:它们的名称总是以 % 开头。此外,它们只能被直接调用,不能作为普通值使用(例如,不能将它们赋值给其他变量)。
function fn() { /* ... */ }
const status = %GetOptimizationStatus(fn);
if (status === 2) {
console.log("The function is not optimized!");
}
完整的 V8 内部函数列表可在 V8 源代码 中找到。
要在 @babel/parser 中启用此语法,可使用 v8intrinsic 插件:
const { parse } = require("@babel/parser");
parse(code, {
plugins: ["v8intrinsic"]
})
空值合并运算符 (??) 更新 (#10269)
空值合并运算符的 Stage 3 提案最近进行了更新:为避免与其他逻辑运算符 (&& 和 ||) 的优先级混淆,规范已更改为禁止混合使用这些运算符。
这意味着以下表达式现在无效:
a ?? b || c;
a && b ?? c;
相反,你应该在适当的地方添加括号:
(a ?? b) || c; /* or */ a ?? (b || c);
(a && b) ?? c; /* or */ a && (b ?? c);
这与一元减号 (-) 和幂运算符 (**) 的交互方式类似:你不能写 -1 ** 2,而必须在 (-1) ** 2 和 -(1 ** 2) 之间做出选择。