ES2018 新特性
for await...of
在异步或者同步可迭代对象上创建一个迭代循环,包括String
,Array
,Array-like
对象(比如arguments
或者NodeList
),TypedArray
,Map
,Set
和自定义的异步或者同步迭代对象。其会调用自定义迭代钩子,并为每个不同属性的值执行语句。
1 | async function* asyncGenerator() { |
模板字符串
ES9 开始,模板字符串允许嵌套支持常见转义序列,移除对 ECMAScript 在带标签的模板字符串中转义序列的语法限制。
不过,非法转义序列在”cooked”当中仍然会体现出来。它们将以undefined
元素的形式存在于”cooked”之中,代码如下:
1 | function latex(str) { |
.finally(()=>{})
同.catch(),.then()一样用于异步操作
不管异步操作状态变为 reject 还是 resolve 都会执行 finally 中的回调函数,
表示异步操作已经执行完了
正则表达式新特性
- 点匹配符 dotAll,匹配除了换行符(\n 或\r)之外的所有字符
如果想要匹配所有字符可以使用\d
和\D
表示一切数字和非数字。
1 | let regex = /./; |
ES2018 可以使用 s 标志配合./dotAll 匹配符,匹配所有的字符
1 | /one\.two/s.test('one\ntwo') //true |
- 匹配组命名
1 | const re=/(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/; |
可以使用 \k<name>
使用前面已经命名过得分组名称
1 | const re=/\b(?<dup\w+>\s+\k<dup>\b/ |
在 replace 函数里面使用\$<name>
实现替换
1 | const str='red & blue'; |
正则表达式反向(lookbehind)断言
断言是一个对当前匹配位置之前或之后的字符的测试,它不会实际消耗任何字符,所以断言也被称为非消耗性匹配或非获取匹配。
(?<=pattern)
零宽反向肯定断言1
2
3
4
5
6
7
8
9const re=/(?<=\$|£|€)\d+(\.\d*)?/;
re.exec('199')
//null
re.exec('$199)
//['199',undefined,index:1,input:'$199',groups:undefined]
re.exec('€50')
//["50", undefined, index: 1, input: "€50", groups: undefined]
'abc123'.match(/(?<=(\d+)(\d+))$/)
// ["", "1", "23", index: 6, input: "abc123", groups: undefined](?<!pattern)
零宽反向否定断言1
2
3
4
5const re=/(?<!un)available/;
re.exec('We regret this service is currently unavailable')
// null
re.exec('this service is available)
// ["available", index: 15, input: "The service is available", groups: undefined]正则表达式 Unicode 转义
\d 仅匹配数组字符[0,9]
\p{类型} 匹配某一类型的字符
匹配所有数字1
2
3
4const regex = /^\p{Number}+$/u;
regex.test('²³¹¼½¾') // true
regex.test('㉛㉜㉝') // true
regex.test('ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫ') // true匹配所有空格
1
\p{White_Space}
匹配字母
1
2
3const str='ض';
/\p{Alphabetic}/u.test(str) //true
/\w/u.test(str) //false否定匹配 \P{}
1
2
3
4
5/\P{Number}/u.test('㉛') //false
/\P{Number}/u.test('ض') //true
/\P{Alphabetic}/u.test('㉛') //true
/\P{Alphabetic}/u.test('ض') //false
对象扩展操作符
Promise.prototype.finally()
返回一个Promise
,当 promise 的状态变更,不管变成rejected
或fulfilled
,最终都会执行finally()
的回调。