一、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