ES2018新特性学习
ES全称ECMAScript,下面将会列出ES2018(ES9)中已经进入stage-4的新特性。
新特性列表
ES2018新特性有:
1.对象的扩展运算符
2.正则表达式的改进
3.异步迭代器和异步生成器
4.Promise的finally回调
一、对象的拓展运算符
拓展运算符,也叫Rest/Spread,在ES6时提出了数组的扩展运算符,仅用于数组,而在ES9中则新增了对象的拓展运算符。扩展运算符用...
表示。
用法:
ES6:
example1:
const arr = [1,2,3,4,5]; |
example2:
const nums = [23,12,3,12,3]; |
ES9:
example3:
const obj = { a : 1 , b : 2 , c : 3 , d : 4}; |
example4:
const obj1 = { a : 1 , b : 2}; |
注意:
1.解构赋值必须是最后一个参数,否则会报错。
2.解构赋值的后的对象创建的是新的引用。
const obj1 = { a : 1}; |
二、正则表达式的改进
在ES9中,对于正则表达式的改进主要有四个方面:
1.位置运算符
2.Unicode转义
3.命名捕获组
4.修饰符s
用法:
1.位置修饰符
位置修饰符主要有四个:
q?=p
:捕获q的后面是有p的字符串
const reg = /hello(?= world)/; |
q?!p
:捕获q的后面不为p的字符串
const reg = /hello(?= world)/; |
(?<=q)p
:捕获p前面有q的字符串
const reg = /(?<=hello) world/; |
(?<!q)p
:捕获p前面没有q的字符串
const reg = /(?<!hello) world/; |
2.Unicode转义
Unicode转义可以通过\p{...}
捕获,\P{...}
捕获的是不符合转义的字符串。大括号内可以传入不同类型的unicode字符关键字,以下是不同unicode字符关键字的示例:
ASCII :捕获ASCII 字符集的字符串
const reg = /^\p{ASCII}+$/u; |
ASCII_Hex_Digit : 捕获16进制数字字符串
const reg = /^\p{ASCII_Hex_Digit}+$/u; |
Uppercase/Lowercase : 捕获大或小写的字符串
/\p{Uppercase}/u.test('A'); //true |
White_Space :捕获空格/\p{White_Space}/u.test(' ') //true
Emoji : 捕获emoji表情
/\p{Emoji}/u.test('🙃'); //true |
这里列出了部分的unicode关键字,还有其他更多可以查看https://github.com/tc39/proposal-regexp-unicode-property-escapes
3.命名捕获组
捕获结果中新增了groups
对象,可以将捕获一些字段放入捕获结果的groups中。格式为(?<name>Regexp)
,其中name
为groups中的key
值,可以通过该key
值拿到捕获的结果,Regexp
为要捕获的正则表达式。
const reg = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/ |
4.修饰符s
增加了新的修饰符s
,可以让.
匹配任意的字符,包括换行符。又叫dot all。
/hello.world/.test('hello\nworld'); //false |
三、异步迭代器和异步生成器
迭代器和生成器
迭代器(Iterator)和生成器(Generator)于ES6中提出。
Iterator主要用于遍历不同的数据结构,遍历的数据结构要具有Symbol.iterator
属性。Iterator中包含next
方法,调用next
方法可以返回两个值为value
和done
,value
为返回的值,done
为标识遍历是否结束,当为false
时,遍历未结束,当为true
时,遍历结束。ES6提供了for...of
来遍历Iterator数据。
数组是默认具有Symbol.iterator
属性的,以数组为例:
const arr = ['a','b','c','d','e']; |
Generator函数是ES6提供的一种异步解决方案。执行Generator函数会返回一个遍历器对象,返回的遍历器对象,可以依次遍历Generator函数内部的每一个状态。Generator函数有两个特征,一是function
关键字与函数名之间有一个*
号,二是函数体内部使用yield
表达式,定义不同的内部状态。
function* Test(){ |
异步迭代器和异步生成器
异步迭代器与同步迭代器的区别在于,同步迭代器的next
方法返回的是包含value
和done
的对象,异步迭代器的next
方法返回的是promise对象,且promise对象回调中参数包含value
和done
对象。异步迭代器中包含的Symbol.asyncIterator
属性。
asyncIterator.next().then(({value , done}) => { |
异步生成器与普通生成器在于,异步生成器的定义加入了async
,且内部可以使用await
,返回的是一个具有Symbol.asyncIterator
方法的对象。因此可以用异步生成器创建异步迭代器。
async function* Test(){ |
for...of
只能用来遍历同步迭代器,因此ES9提供了for...await...of
来遍历异步迭代器。
for await (const item of test){ |
四、Promise的finally回调
在ES9中,新增了Promise的finally
回调函数,无论Promise返回结果是成功执行then()
还是失败执行catch()
,都会执行finally
回调函数。
function test(num){ |
参考文档
1.THE ES2018 GUIDE
2.ES9中的异步迭代器(Async iterator)和异步生成器(Async generator)