7.6.0发布——私有静态访问器和V8内在语法
我们刚刚发布了一个新的Babel小版本!
它包括对类中静态私有访问器的支持,以及对V8内在句法的解析器支持。我们还修复了一堆与TDZ处理有关的长期存在的问题,并改进了对do-expressions的支持。你可以在GitHub上阅读整个更新日志。
感谢Serhii Muryhin,Ashwin Ramaswami,Sungmin Lee,Serge Havas,Ziad El Khoury Hanna,Even Alander,Shrey Banga,Dylan Kirkby,Ajay Sagar,Adam Ramberg, 和Bin Xin的第一个PR!(同时感谢Codetriage README Bot和dependabot🤖)
彭博社在继续赞助Babel中新类特性的实现:在给了我们很多新的类特性(静态私有字段、私有实例方法、私有实例访问器和静态私有方法)之后,他们刚刚实现了静态私有getters和setters。
另一个大的呼声来自于 前端大师在过去的一个月里,他们提供了两笔大额捐款,还有我们所有的赞助商,他们让Babel团队有更多的时间在这个项目上!
如果你或你的公司想支持Babel和JavaScript的发展,但不确定如何支持,你可以在OpenCollective上向我们捐款,更好的是,直接与我们一起实施新的ECMAScript提案作为一个志愿者驱动的项目,我们依靠社区的支持,既为我们支持广大的JavaScript用户的努力提供资金,也为代码的所有权提供资金。如果你想进一步讨论,请联系Henry:henry@babeljs.io!
私有静态访问器(getters和setters)
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 (如果你还没有添加),或者在在线复制中启用stage-3 预设来测试这个新功能。
类私有功能支持终于完成了 🎉
| 类的私有性 | 实例 | 静态 |
|---|---|---|
| 字段 | ||
class A { #a = 1 } | 7.0.0 | 7.1.0 |
| 方法 | ||
class A { #a() {} } | 7.2.0 | 7.4.0 |
| 访问者 | ||
class A { get #a() {} } | 7.3.0 | 7.6.0 |

V8内在运行时函数解析
⚠️这是一种非标准的语言扩展,只有在启用
--allow-natives-syntax命令行标志时才能在V8中使用。
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本征的全部列表。
你可以通过使用v8intrinsic 插件在@babel/parser 中启用这种语法。
const { parse } = require("@babel/parser");
parse(code, {
plugins: ["v8intrinsic"]
})
空值凝聚运算符 (??) 更新
nullish凝聚阶段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) 之间选择。