本文主要介绍ES2018 新出的一些特性
1.异步迭代
允许 async/await 与 for-of 一起使用,以串行的方式运行异步操作,达到异步函数的迭代效果。
async function process(array) { for await (let i of array) { doSomething(i); }}
2.Promise.finally()
在ES6中,一个Promise
链要么成功进入最后一个then()
要么失败触发catch()
。而实际中,我们可能需要无论Promise
无论成功还是失败,都运行相同的代码。例如清除,删除回话,关闭数据库连接等操作。
ES9中,允许使用finally()
来指定最终的逻辑。
test().then((result)=>{}) .catch((err)=>{}) .finally(()=>{})
3.Rest/Spread属性
该属性在ES6中是指展开运算符: ... 。在ES6中 只能适用于数组,但是在ES9中 对象也可以使用展开运算符。
展开运算符的作用:
1.函数使用 ... 接收未知数量的参数
//数组restParam(1, 2, 3, 4, 5);function restParam(p1, p2, ...p3) { // p1 = 1 // p2 = 2 // p3 = [3, 4, 5]}//对象var obj = { a: 1, b: 2, c: 3 }foo(obj)function foo({a, ...param}) { console.log(a); //1 console.log(param) //{b: 2, c: 3} }
2.展开运算
//数组: const values = [99, 100, -1, 48, 16]; console.log( Math.max(...values) ); // 100//对象: var obj = { a: 1, b: 2, c: 3 } const { a, ...param } = obj; console.log(a) //1 console.log(param) //{b: 2, c: 3}
对象的用法1---浅拷贝
1 var obj = { 2 name: 'LinDaiDai', 3 looks: 'handsome', 4 foo() { 5 console.log('old'); 6 }, 7 set setLooks(newVal) { 8 this.looks = newVal 9 },10 get getName() {11 console.log(this.name)12 }13 }14 15 var cloneObj = {...obj};16 cloneObj.foo = function() {17 console.log('new')18 };19 console.log(obj) 20 // { name: 'LinDaiDai',looks: 'handsome', foo: f foo(), get getName:f getName(), set setLooks: f setLooks(newVal)}21 console.log(cloneObj)22 // { name: 'LinDaiDai',looks: 'handsome', foo: f foo(), getName: undefined, setLooks: undefined }23 obj.foo()24 // old25 cloneObj.foo()26 // new
对象的用法2---合并对象
const obj1={a:1,b:2};const obj2={c:3,d:4};const obj3={...obj1,...obj2};console.log(obj3) //{a: 1, b: 2, c: 3, d: 4}//同:const merged = Object.assign({}, obj1, obj2);
4.正则表达式---命名捕获组
4.1 JavaScript正则表达式使用exec()匹配能够返回一个包含匹配的字符串的类数组。
先上一个对比案例
//ES9使用了符号 ?const reDate = /(? \d{4})-(? \d{2})-(? \d{2})/, match = reDate.exec('2018-08-06') console.log(match); // [2018-08-06, 08, 06, 2018, groups: {day: 06, month: 08, year: 2018}] //此时可以使用groups对象来获取年月日 console.log(match.groups.year) // 2018 console.log(match.groups.month) // 08 console.log(match.groups.day) // 06//ES6命名捕获的方式: const reDate = /(\d{4})-(\d{2})-(\d{2})/, match = reDate.exec('2018-08-06'); console.log(match); // [2018-08-06, 2018, 08, 06] // 这样就可以直接用索引来获取年月日: match[0] //2018-08-06 match[1] // 2018 match[2] // 08 match[3] // 06
ES9的命名捕获组的写法相当于是给每个匹配项都添加了一个名字(?<name>),然后存储到返回值match中。match多了一个属性groups,但是match的长度没有变化。(是作为match的一个隐藏属性?)
4.2 结合replace()
const reDate = /(?\d{4})-(? \d{2})-(? \d{2})/, d = '2018-08-06' USADate = d.replace(reDate, '$ -$ -$ ');console.log(USADate);// 08-06-2018
5.正则表达式---反向断言
先行断言 VS 反向断言
6.正则表达式---新增标记 s
i:不区分大小写;
g:全局搜索;
m:多行查找;
s:允许终止符的出现---正则表达式中点 .
匹配除回车外的任何单字符,标记s
改变这种行为;
// \n的换行console.log(/hello.world/.test('hello\nworld')); // falseconsole.log(/hello.world/s.test('hello\nworld')) // true// \r的回车console.log(/hello.world/.test('hello\rworld')) //falseconsole.log(/hello.world/s.test('hello\rworld')) //true// . 匹配除回车外的任何字符console.log(/hello.world/s.test(`helloworld`)) // trueconsole.log(/hello.world/.test(`helloworld`)) // false
7.正则表达式---Unicode转义
形式为 \p{..} 和 \P{..} 。并在正则结尾使用 u 进行设置
const reGreekSymbol = /\p{Script=Greek}/u; //Greek 是希腊语 console.log(reGreekSymbol.test('π')); // true
参考地址: