7.6.0发布——私有静态访问器和V8内在语法

7,748 阅读3分钟

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 Botdependabot🤖)

彭博社在继续赞助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.07.1.0
方法
class A { #a() {} }7.2.07.4.0
访问者
class A { get #a() {} }7.3.07.6.0

It's time to party!

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) 之间选择。