'`Atomics.wait`, `Atomics.notify`, `Atomics.waitAsync`
Atomics.wait
和 Atomics.notify
是底层同步原语,适用于实现互斥锁和其他同步手段。然而,由于Atomics.wait
是阻塞的,无法在主线程上调用(尝试这样做会抛出 TypeError
)。
Atomics.wait
和 Atomics.notify
是底层同步原语,适用于实现互斥锁和其他同步手段。然而,由于Atomics.wait
是阻塞的,无法在主线程上调用(尝试这样做会抛出 TypeError
)。
空值合并提案 (??
) 添加了一个新的短路操作符,用于处理默认值。
你可能已经熟悉其他的短路操作符 &&
和 ||
。这两个操作符处理“真值”和“假值”。假设代码示例为 lhs && rhs
。如果 lhs
(即左操作数)为假值,则表达式返回 lhs
。否则,返回 rhs
(即右操作数)。代码示例 lhs || rhs
的逻辑则相反。如果 lhs
为真值,则表达式返回 lhs
。否则,返回 rhs
。
在 JavaScript 中长链式的属性访问可能容易出错,因为它们中的任何一个都可能会计算为 null
或 undefined
(也称为“空值”)。在每一步检查属性的存在性容易演变为深度嵌套的 if
语句结构,或者带有长链属性访问的 if
条件语句。
如果你之前为网页浏览器编写过 JavaScript,你可能用过 window
来访问全局 this
。在 Node.js 中,你可能使用过 global
。如果你编写的代码需要同时在这两种环境下运行,你可能会检测这些对象哪个可用,然后使用它——但是随着你想支持的环境和用例数量的增加,需要检查的标识符列表会迅速膨胀,事情变得复杂起来:
自从 ES2015 引入 Promise 后,JavaScript 支持的 Promise 组合器只有两个:静态方法 Promise.all
和 Promise.race
。
目前有两个新提案正在进行标准化过程:Promise.allSettled
和 Promise.any
。随着这些新增内容,JavaScript 中将总共有四种 Promise 组合器,每种都支持不同的使用场景。
通常会在字符串上重复应用相同的正则表达式以获取所有匹配项。在一定程度上,现在可以通过使用 String#match
方法来实现这一点。
在这个例子中,我们找到所有仅包含十六进制数字的单词,并记录每个匹配项:
const string = '魔术十六进制数字:DEADBEEF CAFE';
const regex = /\b\p{ASCII_Hex_Digit}+\b/gu;
for (const match of string.match(regex)) {
console.log(match);
}
// 输出:
//
// 'DEADBEEF'
// 'CAFE'
然而,这只会给你匹配的子字符串。通常,你不仅仅想要子字符串,还需要其他信息,比如每个子字符串的索引或者每个匹配中的捕获组。
通过编写你自己的循环,并自己记录匹配对象也可以实现这一点,但这有点麻烦而且不太方便:
const string = '魔术十六进制数字:DEADBEEF CAFE';
const regex = /\b\p{ASCII_Hex_Digit}+\b/gu;
let match;
while (match = regex.exec(string)) {
console.log(match);
}
// 输出:
//
// [ 'DEADBEEF', index: 19, input: '魔术十六进制数字:DEADBEEF CAFE' ]
// [ 'CAFE', index: 28, input: '魔术十六进制数字:DEADBEEF CAFE' ]
新的 String#matchAll
API 使得这一过程比以往更加简单:你现在可以编写一个简单的 for
-of
循环来获取所有的匹配对象。
const string = '魔术十六进制数字:DEADBEEF CAFE';
const regex = /\b\p{ASCII_Hex_Digit}+\b/gu;
for (const match of string.matchAll(regex)) {
console.log(match);
}
// 输出:
//
// [ 'DEADBEEF', index: 19, input: '魔术十六进制数字:DEADBEEF CAFE' ]
// [ 'CAFE', index: 28, input: '魔术十六进制数字:DEADBEEF CAFE' ]
String#matchAll
对于带有捕获组的正则表达式特别有用。它为每个匹配提供完整的信息,包括捕获组。
const string = '喜欢的 GitHub 仓库:tc39/ecma262 v8/v8.dev';
const regex = /\b(?<owner>[a-z0-9]+)\/(?<repo>[a-z0-9\.]+)\b/g;
for (const match of string.matchAll(regex)) {
console.log(`${match[0]} 在 ${match.index} 上,输入为 '${match.input}'`);
console.log(`→ 所有者: ${match.groups.owner}`);
console.log(`→ 仓库: ${match.groups.repo}`);
}
在JavaScript模块中,已经可以使用以下语法:
import * as utils from './utils.mjs';
然而,之前没有对称的export
语法… 直到现在:
export * as utils from './utils.mjs';
BigInt
是 JavaScript 中的一种新型数字原始值,可以表示任意精度的整数。通过 BigInt
,您可以安全地存储并操作即使超出 Number
安全整数限制的大整数。本文通过对比 JavaScript 中的 BigInt
和 Number
,逐步介绍它的一些使用场景,并说明 Chrome 67 中的新功能。
动态 import()
引入了一种类似函数的新形式的 import
,相比静态 import
解锁了新的功能。这篇文章对比了两者并概述了新功能。