JavaScript 的标准制定组织 ECMAScript 在 2017 年底发布了 ECMAScript 2018(简称 ES9)的最终版本,在新的版本中引入了一些非常有趣且实用的新特性。本文将介绍其中最重要且有用的一些新特性,包括异步迭代器、正则表达式和 Promise 的更新等。
异步迭代器
异步迭代器是 ES9 中最为重要的更新之一。在 ES8 中,引入了同步迭代器,使我们可以对数组、Map、Set 等集合类型进行迭代。而在 ES9 中,新增了异步迭代器,可以在遍历异步数据流(例如异步生成器或异步请求)时使用。
异步迭代器采用 Symbol.asyncIterator 来定义,并返回一个对象,该对象必须实现 next 函数,返回一个 Promise 对象,用于控制迭代器的下一个值何时被生产出来,示例如下:
-- -------------------- ---- ------- ----- --------- ---------------- - ----- --- --------------- -- ------------------- ------- ----- -- ----- --- --------------- -- ------------------- ------- ----- -- ----- --- --------------- -- ------------------- ------- ----- -- - ----- -------- --------------- - --- ----- ------ --- -- ----------------- - ----------------- - - ----------------
上述代码会每隔一秒输出 1、2、3,其中 asyncGenerator 函数是一个异步生成器,它的每个 next 值都是在一个延时操作之后才返回的。而 asyncIterator 通过 for await of 语法来遍历并输出异步生成器所生成的值。
异步迭代器的出现,使得我们可以方便地处理有异步操作的数据流,如异步请求、异步文件读取等。这些都可以通过 for await of 语法来处理。
正则表达式的更新
在 ES9 中,正则表达式引入了一些实用的更新,包括正则表达式命名捕获组、反向断言以及 Unicode 范围表达式。
我们先来看一下正则表达式的命名捕获组。以往,我们可以通过'$1'来获取正则表达式中第一个捕获组的值,而现在我们可以通过名称来获取捕获组的值,示例如下:
const str = '2019-04-10'; const { groups: { year, month, day } } = /^(\d{4})-(?<month>\d{2})-(?<day>\d{2})$/.exec(str); console.log(year); // '2019' console.log(month); // '04' console.log(day); // '10'
在上述代码中,正则表达式使用了'(?<month>\d{2})'这样的语法来定义了一个名为 month 的捕获组。使用解构语法的'{ groups }',我们可以方便地获取到各个捕获组的值,更加直观和方便。
除了命名捕获组外,ES9 还新增了反向断言的特性。我们可以使用'(?<=...)'或'(?<!...)'这样的语法来定义正则表达式的前置或后置断言,示例如下:
const str = 'hello world'; const result = /(?<=hello )world/.test(str); console.log(result); // true
在上述代码中,我们使用'(?<=hello )'来定义了一个前置断言,表示匹配'hello '后面紧跟着'world'的字符串。这是非常实用的特性,在一些复杂的全文匹配中可以方便地取出我们需要的内容。
最后,ES9 引入了 Unicode 范围表达式,我们可以使用'[\p{...}]'这样的语法来表示一些 Unicode 范围内的字符,示例如下:
const regex = /^\p{Letter}+$/u; console.log(regex.test('hello')); // true console.log(regex.test('你好')); // true console.log(regex.test('hello 你好')); // false
在上述代码中,我们使用了'[\p{Letter}+]'这样的正则表达式来限制字符串只能由大小写字母组成。注意,使用 Unicode 范围表达式时,需要添加'u'标志来进行开启。
Promise.finally 方法
在 ES9 中,Promise 类型新增了 finally 方法,该方法将在 Promise 异步任务执行完毕后无论成功或失败都会被执行。这个特性十分实用,我们可以在 finally 方法中进行一些收尾工作,例如关闭数据库连接、清理工作等。
示例如下:
-- -------------------- ---- ------- -------- ------------- - ------ --- ----------------- ------- -- - -- ---- ------------- -- - ----- --- - ----------------------- - ---- -- ---- -- -- - ------------- - ---- - -------------- -- --- -------- - -- ------ --- - ------------- --------- -- ----------------- ------------ -- --------------------- ----------- -- -------------------- -------------
在上述代码中,我们在 Promise 对象执行完毕后添加了 finally 方法,无论任务成功或失败都会在 finally 方法中进行处理。这是一个非常实用的功能。
总结
ECMAScript 2018(ES9)引入了许多实用的新特性,其中异步迭代器、正则表达式和 Promise 的更新是最为重要和常用的更新。异步迭代器和 Promise 的更新让我们可以更方便地处理异步数据流和对 Promise 进行更完善的收尾处理,而正则表达式的命名捕获组、反向断言和 Unicode 范围表达式则为我们提供了更为强大的正则表达式语法特性。这些新特性的引入,让我们的开发变得更加高效、直观和实用。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64c9728f5ad90b6d041701f8