JavaScript ECMAScript 2018
JavaScript 2018 新特性
| 功能 | 描述 | |
|---|---|---|
| 异步迭代 | 允许在 for/of 循环中使用 await 关键字 | |
| Promise Finally | 当 Promise 被"完成"或"拒绝"时,会安排一个函数执行 | |
| 数组剩余元素 | 允许销毁数组并收集剩余元素 | |
| 对象Rest(剩余)属性 | 允许销毁对象并回收剩余资源 | |
| 共享内存 | 允许程序的不同部分访问同一块内存 |
2018 年新增正则表达式功能
| 功能 | 描述 | |
|---|---|---|
| /s | 允许使用点号 (.) 元字符匹配行终止符 | |
| \p{} | 匹配具有 Unicode 字符属性的字符 | |
| (?<=y) | (?<=y)x 匹配"x",如果"x"前面有"y"。 | |
| (?<!y) | (?<!y)x 匹配"x",如果"x"前面没有"y"。 | |
| (?<name>) | 捕获文本并命名(标签) |
浏览器支持
自2020年6月起,所有现代浏览器均支持ECMAScript 2018:
| Chrome 64 |
Edge 79 |
Firefox 78 |
Safari 12 |
Opera 51 |
| 2018年1月 | 2020年1月 | 2020年6月 | 2018年9月 | 2018年2月 |
JavaScript 异步迭代
ECMAScript 2018 添加了异步迭代器和可迭代对象。
对于异步可迭代对象,我们可以在for/of循环中使用await关键字。
示例
for await () {}JavaScript Promise.finally()
ECMAScript 2018 通过 Promise.finally 完善了 Promise 对象的完整实现:
Promise.finally() 定义了一个函数,当 Promise 被成功解析或被拒绝时,该函数将被执行。
示例
let myPromise = new Promise();
myPromise.then();
myPromise.catch();
myPromise.finally();
JavaScript 数组剩余元素
ECMAScript 2018 添加了剩余运算符 (...)。
剩余运算符 (...) 允许我们销毁数组并收集剩余元素:
JavaScript 对象剩余属性
ECMAScript 2018 添加了剩余操作符 (...)。
这允许我们销毁一个对象,并将剩余部分收集到一个新对象中:
示例
// 创建一个对象:
const car = {type:"Fiat", model:"500", color:"white"};
// 解构对象let {type, model, color} = car;
document.getElementById("demo").innerHTML = "The car type is: " + type;
亲自试一试 »JavaScript 正则表达式新增特性
ECMAScript 2018 新增 4 项正则表达式特性:
- /s (dotAll) 标志
- Unicode 属性转义 (\p{...})
- 后向断言 (?<=y)x 和 (?<!y)x
- 命名捕获组
正则表达式 /s 标志
描述
`s(dotAll)标志允许点(.)元字符匹配任何字符,包括行终止符(例如, , \u2028, \u2029).
如果没有s,则无法匹配行终止符。
正则表达式 \p 元字符
描述
\p "Unicode 属性"元字符匹配任何具有 Unicode 字符属性的字符。
正则表达式后行断言
示例 (?<=y)x
let text = "Hello W3Schools";
let pattern = /(?<=Hello )W3Schools/;
let result = pattern.test(text);
亲自试一试 »描述
(?<=y)x 匹配"x",如果"x"前面有"y"。
负向后视
示例 (?<!y)x
let text = "Hello W3Schools";
let pattern = /(?<=Hello )W3Schools/;
let result = pattern.test(text);
亲自试一试 »描述
(?<!y)x 匹配"x",如果"x"前面没有"y"。
正则表达式命名捕获组
示例 (?<name>...)
const text = "Name: John Doe";
// 使用命名捕获组
const regex = /(?<firstName>\w+) (?<lastName>\w+)/;
const match = text.match(regex);
let fName = match.groups.firstName;
let lName = match.groups.lastName;
亲自试一试 »解释
- (?<firstName>\w+) 捕获一个单词并将其标记为 firstName
- (?<lastName>\w+) 执行相同的操作,将 lastName 标记为 firstName
- text.match() 返回一个包含 groups 属性的数组
- match.groups() 返回一个对象:
{firstName:"John", lastName:"Doe" }
当使用带有捕获组的正则表达式时,字符串的 match() 方法会返回一个包含 groups 属性的结果数组。此 groups 属性是一个对象,其中包含指定捕获组的匹配项。
JavaScript 线程
在 JavaScript 中,您可以使用 Web Workers API 创建线程。
工作线程用于在后台执行代码,以便主程序可以继续执行。
工作线程与主程序同时运行。程序的不同部分同时执行可以节省时间。
JavaScript 共享内存
共享内存是一种允许线程(程序的不同部分)访问和更新同一内存中的相同数据的特性。
除了在线程之间传递数据外,您还可以传递一个指向数据保存所在内存的 SharedArrayBuffer 对象。
SharedArrayBuffer
SharedArrayBuffer 对象表示一个固定长度的原始二进制数据缓冲区,类似于 ArrayBuffer 对象。
