
一、ECMAScript 2016
1、Array.prototype.includes
Array.prototype.includes() - JavaScript | MDN
| 1 | const arr = [1, 2, 3, NaN]; | 
2、指数(幂)运算符 **
| 1 | Math.pow(2, 3) | 
二、ECMAScript 2017
1、Object.values()
Object.values() - JavaScript | MDN
| 1 | const obj = { foo: "bar", baz: 42 }; | 
2、Object.entries()
Object.entries() - JavaScript | MDN
| 1 | const obj = { foo: 'bar', baz: 42 }; | 
3、字符串填充 String padding
String.prototype.padStart() - JavaScript | MDN String.prototype.padEnd() - JavaScript | MDN
| 1 | 'abc'.padStart(10); // " abc" | 
注意,Emojis和双字节字符会占据两位
| 1 | 'heart'.padStart(10, "❤️"); // '❤️❤️❤heart' | 
4、Object.getOwnPropertyDescriptors
Object.getOwnPropertyDescriptor() - JavaScript | MDN
| 1 | Object.getOwnPropertyDescriptor(obj, prop) | 
Object.getOwnPropertyDescriptor()方法返回指定对象上一个自有属性对应的属性描述符。(自有属性指的是直接赋予该对象的属性,不需要从原型链上进行查找的属性)
5、函数参数结尾逗号
| 1 | function fn(a, b,) {} | 
6、Async/Await
async function - JavaScript | MDN
三、ECMAScript 2018
1、共享内存与原子操作
即使有event loop的“伪多线程”和Service Worker的强力增援,但依然掩盖不了JS是单线程的事实。
共享内存与原子操作,给JS带来了多线程的功能,允许开发人员自行管理内存来开发高性能高并发的程序。
直到目前为止,我们只能通过postMessage在JS主线程和web worker之间通信,传输数据。
2、非转义序列的模板字符串
非转义序列的模板字符串 | esnext | es6 es7 es2017 es2018 es2019
3、对象展开运算符
| 1 | let { firstName, age, ...rest } = { | 
4、Promise.prototype.finally()
5、异步迭代器
提供了for-await-of,异步迭代,等待每个promise被resolve再执行下一个
| 1 | const promises = [ | 
| 1 | // old | 
| 1 | // new | 
6、正则表达式相关
- dotAll模式,使 . 可以匹配任意字符
- 命名捕获组,可以理解为增加一个引用
| 1 | const regex = /(\d{4})-(\d{2})-(\d{2})/; | 
- 反向断言 Lookbehind Assertions
- Unicode转义 Unicode Property Escapes
 
        