私有品牌检查,也就是 `#foo in obj`
in
操作符 可以用来测试给定对象(或它的原型链上的任意对象)中是否有给定的属性:
const o1 = {'foo': 0};
console.log('foo' in o1); // true
const o2 = {};
console.log('foo' in o2); // false
const o3 = Object.create(o1);
console.log('foo' in o3); // true
私有品牌检查功能扩展了 in
操作符,支持 私有类字段:
class A {
static test(obj) {
console.log(#foo in obj);
}
#foo = 0;
}
A.test(new A()); // true
A.test({}); // false
class B {
#foo = 0;
}
A.test(new B()); // false; 它不是同一个 #foo
由于私有名称仅在定义它们的类内部可用,所以测试也必须发生在类内部,例如在上面 static test
方法中。
子类实例接收来自父类的私有字段作为自己的属性:
class SubA extends A {};
A.test(new SubA()); // true
但是通过 Object.create
创建的对象(或者通过 __proto__
设置器或 Object.setPrototypeOf
后来设置了原型的对象)没有作为自己的属性接收到私有字段。因为私有字段查找仅适用于自己的属性,所以 in
操作符找不到这些继承的字段:
类的静态初始化块
新的类静态初始化块语法允许开发者将针对某个类定义只运行一次的代码集中到一个地方。考虑下面的示例,其中一个伪随机数生成器使用静态块在 class MyPRNG
定义被评估时初始化一个熵池。
WebAssembly 与 JavaScript BigInt 的集成
JS-BigInt-Integration 特性使在 JavaScript 和 WebAssembly 之间传递 64 位整数变得简单。本文解释了这意味着什么以及为什么有用,包括让开发者更容易、让代码运行更快,以及加速构建时间。
'`Atomics.wait`, `Atomics.notify`, `Atomics.waitAsync`
Atomics.wait
和 Atomics.notify
是底层同步原语,适用于实现互斥锁和其他同步手段。然而,由于Atomics.wait
是阻塞的,无法在主线程上调用(尝试这样做会抛出 TypeError
)。
逻辑赋值
JavaScript 支持一系列复合赋值运算符,允许程序员简洁地表达二元运算和赋值。当前,仅支持数学或按位运算。
`Intl.DisplayNames`
面向全球用户的 Web 应用需要以许多不同语言显示语言、地区、书写系统和货币的名称。这些名称的翻译需要数据,该数据可在 Unicode CLDR 中找到。将数据打包为应用的一部分会耗费开发时间。用户往往更喜欢语言和地区名称的统一翻译,而随着全球地缘政治情况的变化保持数据更新需要持续维护。
快速并行应用与WebAssembly SIMD
SIMD代表 单指令,多数据。SIMD指令是一类特殊的指令,通过在多个数据元素上同时执行相同的操作来利用应用程序中的数据并行性。计算密集型应用程序如音频/视频编解码器、图像处理器,都是利用SIMD指令加速性能的例子。大多数现代架构都支持某些变体的SIMD指令。
正则表达式匹配索引
JavaScript现在具备一个新的正则表达式增强功能,称为“匹配索引”。假设您希望找到JavaScript代码中与保留词重合的无效变量名,并在变量名下输出一个插入号和一个“下划线”,例如:
String.prototype.replaceAll
如果你曾经处理过 JavaScript 中的字符串,很可能遇到过 String#replace
方法。String.prototype.replace(searchValue, replacement)
根据你指定的参数返回一个替换了一些匹配项的字符串: