本文主要介绍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); //
console.log(param) //{b: 2, c: 3}
}

    2.展开运算

//数组:
const values = [99, 100, -1, 48, 16];
console.log( Math.max(...values) ); //
//对象:
var obj = {
a: 1,
b: 2,
c: 3
}
const { a, ...param } = obj;
console.log(a) //
console.log(param) //{b: 2, c: 3}

    对象的用法1---浅拷贝

         var obj = {
name: 'LinDaiDai',
looks: 'handsome',
foo() {
console.log('old');
},
set setLooks(newVal) {
this.looks = newVal
},
get getName() {
console.log(this.name)
}
} var cloneObj = {...obj};
cloneObj.foo = function() {
console.log('new')
};
console.log(obj)
// { name: 'LinDaiDai',looks: 'handsome', foo: f foo(), get getName:f getName(), set setLooks: f setLooks(newVal)}
console.log(cloneObj)
// { name: 'LinDaiDai',looks: 'handsome', foo: f foo(), getName: undefined, setLooks: undefined }
obj.foo()
// old
cloneObj.foo()
// 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使用了符号 ?<name>
const reDate = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\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) //
console.log(match.groups.month) //
console.log(match.groups.day) //
//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] //
match[2] //
match[3] //

  ES9的命名捕获组的写法相当于是给每个匹配项都添加了一个名字(?<name>),然后存储到返回值match中。match多了一个属性groups,但是match的长度没有变化。(是作为match的一个隐藏属性?)

  4.2 结合replace()

const reDate = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/,
d = '2018-08-06'
USADate = d.replace(reDate, '$<month>-$<day>-$<year>');
console.log(USADate);
// 08-06-2018

5.正则表达式---反向断言

  先行断言 VS 反向断言

6.正则表达式---新增标记 s

  i:不区分大小写;

  g:全局搜索;

  m:多行查找;

  s:允许终止符的出现---正则表达式中点 匹配除回车外的任何单字符,标记s改变这种行为;

// \n的换行
console.log(/hello.world/.test('hello\nworld')); // false console.log(/hello.world/s.test('hello\nworld')) // true
// \r的回车
console.log(/hello.world/.test('hello\rworld')) //false
console.log(/hello.world/s.test('hello\rworld')) //true
// . 匹配除回车外的任何字符
console.log(/hello.world/s.test(`hello
world`)) // true
console.log(/hello.world/.test(`hello
world`)) // false

7.正则表达式---Unicode转义

  形式为  \p{..} 和 \P{..} 。并在正则结尾使用 u 进行设置

    const reGreekSymbol = /\p{Script=Greek}/u;  //Greek 是希腊语
console.log(reGreekSymbol.test('π')); // true

参考地址:https://juejin.im/post/5b685ed1e51d4533f52859e8

ES9新内容概括的更多相关文章

  1. 细解JavaScript ES7 ES8 ES9 新特性

    题记:本文提供了一个在线PPT版本,方便您浏览 细解JAVASCRIPT ES7 ES8 ES9 新特性 在线PPT ver 本文的大部分内容译自作者Axel Rauschmayer博士的网站,想了解 ...

  2. Windows cmd 长时间不输出新内容 直到按下ctrl + c 取消或者回车的解决办法

    换了一台新电脑, 在使用 ant 拷贝大量文件的时候 cmd 窗口过了很久没有继续输出新的内容,远远超过平时的耗时, 以为已经卡死 按下 ctrl + c 取消, 这时并没有取消, 而是输出了新内容, ...

  3. 新内容转入github

    所有新内容已经转入 https://github.com/honggzb/Study-General https://github.com/honggzb/Study2016

  4. jQuery 往table添加新内容有以下四个方法:

    Query 添加新内容有以下四个方法: append() - 在被选元素的结尾插入内容 prepend() - 在被选元素的开头插入内容 after() - 在被选元素之后插入内容 before() ...

  5. xcode10设置自定义代码快 - Xcode10新功能新内容

    1. 2. 详情: Xcode10新功能新内容https://blog.csdn.net/u010960265/article/details/80630118

  6. 添加新内容的四个 jQuery 方法:append,prepend,after,before

    添加新内容的四个 jQuery 方法区别如下: append() - 在被选元素(里面)的结尾插入内容prepend() - 在被选元素(里面)的开头插入内容 //jQuery append() 方法 ...

  7. Ajax实例二:取得新内容

    Ajax实例二:取得新内容 通过点击pre和next按钮,从服务器取得最新内容. HTML代码 <div id="slide">图片显示区</div> &l ...

  8. 使用FileStream向txt格式的文本文件 "追加" 新内容并读取

    原文:使用FileStream向txt格式的文本文件 "追加" 新内容并读取 //得到文件路径. static string filePath = AppDomain.Curren ...

  9. ECMAScript 2018(ES9)新特性简介

    目录 简介 异步遍历 Rest/Spread操作符和对象构建 Rest Spread 创建和拷贝对象 Spread和bject.assign() 的区别 正则表达式 promise.finally 模 ...

随机推荐

  1. Python伊始——From Boring to Amazing

    先来谈一下关于Python编程语言的浅薄认知,“一门编程课,仅此而已”这是我几个月前对这门应用技术的认识. 如今看来,却不只是“仅此而已”,作为今年年初被加入计算机二级考试科目的这门技术,或许并不是它 ...

  2. 项目遇到的小问题(关于vue-cli中js点击事件不起作用和iconfont图片下载页面css样式乱的解答)

     第一个:关于vue-cli中js点击事件不起作用 在vue的methods方法queryBtnFun()中拼接html和click操作事件的时候,发现点击事件一起未起作用: 后来发现是DOM执行顺序 ...

  3. shell脚本的一些常用操作

    字符串长度: ${#string}可获取string字符串的长度,如下: jenkins@soft1pc:~$ str="who are you"jenkins@soft1pc:~ ...

  4. Verify_Execute 验证SQL语句执行结果

    #region Verify_Execute /// <summary> /// 验证insert.update.delete执行 /// </summary> /// < ...

  5. Oracle免安装绿色版-PLSQL连接报12154

    在环境变量添加 TNS_ADMIN  值是你的免安装客户端中sqlnet.ora   tnsnames.ora 所在的目录 参考地址:https://blog.csdn.net/feng_na/art ...

  6. Goland开发工具安装教程

    开发工具: 文本类的编辑器:记事本,notepad,sublime text,atom... 通过命令执行程序 IED:集成开发环境(integrated development environmen ...

  7. 取代iframe,实现页面中引入别的页面

    <li> <a href="#addChannel">添加通道</a> </li> window.onload = rightCha ...

  8. 浅析贝叶斯神经网络(Based on Variational Bayesian)

    https://blog.csdn.net/qq_20195745/article/details/82453589 贝叶斯神经网络简介 对于一个神经网络来说,最为核心的是如何根据训练集的数据,得到各 ...

  9. 解决IDEA创建多模块项目找不到创建class类的问题

    最近在利用idea创建一个多模块的java项目,但是让人十分抓狂的事,模块竟然找不到创建class类的选项,如图 前提:创建模块后假如右下角出现 务必要点击import Changes .然后看下是否 ...

  10. vueRouter 子路由嵌套

    router.js import Vue from 'vue' import Router from 'vue-router' import contractPage from './views/co ...