📜  ES9-新功能

📅  最后修改于: 2020-10-25 10:52:10             🧑  作者: Mango


在这里,我们将了解ES9中的新功能。让我们从了解异步生成器开始。

异步发电机及其迭代

可以使用async关键字使异步生成器异步。下面给出了定义异步生成器的语法

async function* generator_name() {
   //statements
}

以下示例显示了一个异步生成器,该生成器在每次调用生成器的next()方法时都返回Promise。


上面的代码输出如下:

{value: 1, done: false}
{value: 2, done: false}
{value: 3, done: false}
{value: undefined, done: true}

等待循环

异步可迭代对象不能使用传统的for..of循环语法进行迭代,因为它们会返回promise。 ES9引入了for await循环来支持异步迭代

下面给出了使用for await循环的语法,其中,

  • 在每次迭代中,将不同属性的值分配给变量,并且可以使用const,let或var声明变量。

  • iterable-要迭代其可迭代属性的对象。
for await (variable of iterable) {
   statement
}

以下示例显示了使用for await循环来迭代异步生成器。


上面代码的输出将如下所示-

end of script
1
2
3

下面的示例使用for等待循环来迭代数组。


上面的代码输出如下:

end of script
10
20
30
40

剩余/价差属性

ES9支持对对象使用Rest和Spread运算符。

示例:Object and Rest运算符

下面的示例说明将rest运算符与对象一起使用。学生的age属性的值将被复制到age变量中,而其余属性的值将使用rest语法`…`被复制到另一个变量中。


上面代码的输出如下:

10
{height: 5, weight: 50}

示例:对象和传播运算符

散布运算符可用于组合多个对象或克隆对象。这在以下示例中显示-


以上代码的输出将如下所示-

{a: 10, b: 20}
{a: 10, b: 20, c: 30}

承诺:finally()

每当兑现承诺时,无论其结果如何,都将执行finally() 。该函数返回一个promise。它可以用来避免Promise的then()catch()处理程序中的代码重复。

句法

下面提到的语法是针对函数finally()的

promise.finally(function() {
});
promise.finally(()=> {
});

以下示例声明了一个异步函数,该函数在延迟3秒后返回正数的平方。如果传递负数,该函数将引发错误。无论承诺被拒绝还是已解决,在两种情况下都将执行finally块中的语句。


上面代码的输出将如下所示

Start
End
//after 3 seconds
result is 100
inside finally
executes all the time

模板字面量修订

从ES7开始,标记模板符合以下转义序列的规则-

  • Unicode转义序列使用“ \ u”表示,例如\ u2764 \ uFE0F

  • Unicode代码点转义序列使用“ \ u {}”表示,例如\ u {2F}

  • 十六进制转义序列用“ \ x”表示,例如\ xA8

  • 八进制字面量转义序列用“”表示,后跟一个或多个数字,例如\ 125

在ES2016及更早版本中,如果无效的转义序列与加标签的函数一起使用,则会引发语法错误,如下所示-

//tagged function with an invalid unicode sequence
myTagFn`\unicode1`
// SyntaxError: malformed Unicode character escape sequence

但是,与早期版本不同,ES9会将无效的unicode序列解析为undefined,并且不会引发错误。这在以下示例中显示-


上面代码的输出将如下所示-

{parsed: undefined}
{parsed: "❤️"}

原始字符串

ES9引入了一个特殊的属性raw ,该属性在tag函数的第一个参数上可用。此属性使您可以在输入原始字符串访问它们,而无需处理转义序列。


上面的代码输出如下:

{Parsed: undefined, Raw: "\unicode"}
{Parsed: "❤️", Raw: "\u2764\uFE0F"}

正则表达式功能

在正则表达式中,点运算符或点号用于匹配单个字符。的\ n点运算符跳过字符,\如图中下面实施例R

console.log(/Tutorials.Point/.test('Tutorials_Point')); //true
console.log(/Tutorials.Point/.test('Tutorials\nPoint')); //false
console.log(/Tutorials.Point/.test('Tutorials\rPoint')); //false

正则表达式模式表示为/ regular_expression /。 test()方法采用字符串参数并搜索正则表达式模式。在上面的示例中, test()方法搜索以Tutorials开头,后跟任何单个字符并以Point结尾的模式。如果在Tutorials和Point之间的输入字符串使用\ n\ r ,则test()方法将返回false。

true
false
false

ES9引入了一个新标志-DotAllFlag(\ s) ,可与Regex一起使用以匹配行终止符和表情符号。这在以下示例中显示-

console.log(/Tutorials.Point/s.test('Tutorials\nPoint'));
console.log(/Tutorials.Point/s.test('Tutorials\rPoint'));

上面代码的输出将如下所述-

true
true

命名捕获组

在ES9之前,捕获组通过索引访问。 ES9允许我们为捕获组分配名称。下面给出了相同的语法-

(?pattern1)

const birthDatePattern = /(?[0-9]{4})-(?[0-9]{2})/;
const birthDate = birthDatePattern.exec('1999-04');
console.log(birthDate.groups.myYear);
console.log(birthDate.groups.myMonth);

上面代码的输出如下所示-

1999
04