跳到主要内容

9 篇博文 含有标签「ES2020」

查看所有标签

空值合并

· 阅读需 7 分钟
Justin Ridgewell

空值合并提案 (??) 添加了一个新的短路操作符,用于处理默认值。

你可能已经熟悉其他的短路操作符 &&||。这两个操作符处理“真值”和“假值”。假设代码示例为 lhs && rhs。如果 lhs(即左操作数)为假值,则表达式返回 lhs。否则,返回 rhs(即右操作数)。代码示例 lhs || rhs 的逻辑则相反。如果 lhs 为真值,则表达式返回 lhs。否则,返回 rhs

可选的链式操作

· 阅读需 5 分钟
Maya Armyanova ([@Zmayski](https://twitter.com/Zmayski)), 可选链的破除者

在 JavaScript 中长链式的属性访问可能容易出错,因为它们中的任何一个都可能会计算为 nullundefined(也称为“空值”)。在每一步检查属性的存在性容易演变为深度嵌套的 if 语句结构,或者带有长链属性访问的 if 条件语句。

`globalThis`

· 阅读需 2 分钟
Mathias Bynens ([@mathias](https://twitter.com/mathias))

如果你之前为网页浏览器编写过 JavaScript,你可能用过 window 来访问全局 this。在 Node.js 中,你可能使用过 global。如果你编写的代码需要同时在这两种环境下运行,你可能会检测这些对象哪个可用,然后使用它——但是随着你想支持的环境和用例数量的增加,需要检查的标识符列表会迅速膨胀,事情变得复杂起来:

Promise 组合器

· 阅读需 4 分钟
Mathias Bynens ([@mathias](https://twitter.com/mathias))

自从 ES2015 引入 Promise 后,JavaScript 支持的 Promise 组合器只有两个:静态方法 Promise.allPromise.race

目前有两个新提案正在进行标准化过程:Promise.allSettledPromise.any。随着这些新增内容,JavaScript 中将总共有四种 Promise 组合器,每种都支持不同的使用场景。

`String.prototype.matchAll`

· 阅读需 3 分钟
Mathias Bynens ([@mathias](https://twitter.com/mathias))

通常会在字符串上重复应用相同的正则表达式以获取所有匹配项。在一定程度上,现在可以通过使用 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}`);
}

BigInt: JavaScript 中任意精度的整数

· 阅读需 9 分钟
Mathias Bynens ([@mathias](https://twitter.com/mathias))

BigInt 是 JavaScript 中的一种新型数字原始值,可以表示任意精度的整数。通过 BigInt,您可以安全地存储并操作即使超出 Number 安全整数限制的大整数。本文通过对比 JavaScript 中的 BigIntNumber,逐步介绍它的一些使用场景,并说明 Chrome 67 中的新功能。

动态 `import()`

· 阅读需 5 分钟
Mathias Bynens ([@mathias](https://twitter.com/mathias))

动态 import() 引入了一种类似函数的新形式的 import,相比静态 import 解锁了新的功能。这篇文章对比了两者并概述了新功能。