Rest/Spread 属性 rest 将对象的剩余属性复制到一个新对象中。javascript
let { x, y, ...z } = { x: 1, y: 2, a: 3, b: 4 }; x; // 1 y; // 2 z; // { a: 3, b: 4 }
spread 将对象的属性快速复制到另外一个对象。php
let n = { x, y, ...z }; n; // { x: 1, y: 2, a: 3, b: 4 }
异步iterator和异步iterables 与iterator不一样,异步iterator的next()方法返回一个包含{ value, done }的promise。java
const { value, done } = syncIterator.next(); asyncIterator.next().then(({ value, done }) => /* ... */);
能够看到syncIterator是一个异步遍历器。它能够经过异步generator生成。下面演示如何定义异步generator函数。
异步 generator 函数web
async function* asyncGen() { let p1 = new Promise((resolve, reject) =>{ setTimeout(()=>{ resolve(1); }, 1000) }); let p2 = new Promise((resolve, reject) =>{ setTimeout(()=>{ resolve(2); }, 1000) }); yield await p1; yield await p2 }
for-await-of es2018提供了新的遍历语法对异步 iterator 进行遍历。ajax
for await (const val of asyncGen()) { console.log(val); }
Promise.prototype.finally()正则表达式
Promise.prototype.finally()
无论promise的执行结果是成功仍是失败,在promise执行完成后,会触发一个回调函数。常见的应用场景好比在ajax请求成功或失败后,隐藏loading动画。json
fetch('https://demo.com/endpoint') .then(res => { // ... }) .catch(err => { // ... }) .finally(() => { // do sth no matter success or failure })
tagged 模板字符串与 转义序列 从es2016开始,tagged 模板字符串会对以u、u{}、x开头或者加数字开头的字符串进行转义。可是若是在模板字符串中出现以上述字符开头的非转义字符的话,会报语法错误。
es2018中取消了tagged 模板中对于转义字符的限制,正常解析的话能够正常获取转义字符的值,不然的话返回undefined。promise
function latex(str) { return { "cooked": str[0], "raw": str.raw[0] } } latex`\unicode` // { cooked: undefined, raw: "\unicode"}
能够看到咱们经过str[0]去获取转义字符的值并不会报错。经过str.raw[0]能够正常取得字符串"unicode"。
正则相关的特性 s (dotAll)模式 咱们知道元字符浏览器
.
没法匹配r n u{2048} u{2049}等换行符。
在 ES2018 中为正则表达式增长了一个新的标志less
s
用来表示属性
dotAll
。以使
.
能够匹配任意字符, 包括换行符。
const re = /foo.bar/s; re.test('foo\nbar'); // → true re.dotAll // → true re.flags // → 's'
命名捕获组 named capture groups 正则表达式中能够经过数字索引来引用()语法捕获的部分匹配结果。如
let re = /(\d{4})-(\d{2})-(\d{2})/; let result = re.exec('2015-01-02'); console.log(result[1],result[2],result[3]); // 2015, 01, 02
es2018中提供了命名捕获组的功能。咱们能够经过
(?<name>...)
语法给捕获组命名。
let re = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/u; let result = re.exec('2015-01-02'); // result.groups.year === '2015'; // result.groups.month === '01'; // result.groups.day === '02';
或者以解构语法简化代码:
let {groups: {year, month, day}} = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/u.exec('2015-01-02'); console.log(`year: ${year}, month: ${month}, day: ${day}`); // prints year: 2015, month: 01, day: 02
后行断言 es5中,正则只支持先行断言。例如:
正向先行断言/x(?=y)/表示字符x后面的位置必须是y。
负向先行断言/x(?!y)/表示x字符后面的位置不能等于y。
es2018中新增了后行断言的支持。例如:
/(?<=y)x/表示字符x前面的位置必须是y。
/(?<!y)x/表示字符x前面的位置不能是y。
let re = /(?<=java)script/; consle.log(re.test('javascript')); // true
Unicode property escapes
Unicode property escapes
使得能够在js正则表达式中本地访问这些
Unicode
字符属性。 例如,模式
\p {Script_Extensions = Greek}
匹配希腊脚本中的任意符号。
const regexGreekSymbol = /\p{Script_Extensions=Greek}/u; regexGreekSymbol.test('π'); // → true
可选的catch参数 es2018对语法进行了修改,
catch
在没使用参数的状况下省略括号。例如:
try { // try to use a web feature which may not be implemented } catch (unused) { // fall back to a less desirable web feature with broader support }
上述代码在新规范下能够写成:
try { // try to use a web feature which may not be implemented } catch { // 省略catch后的函数括号 }
JSON 超集 咱们知道es5中经过JSON.parse能够将json字符串转换成js的json对象。但有例外,那就是当json文本中存在未转义的换行符如u2028,u2029时,js中会报语法错误。
es2018中作了扩展,支持了全部的json文本,所以一样容许未转义的换行符的存在。
const LS = " "; const PS = eval("'\u2029'");
上述代码片断在实现了es2018规范的浏览器中是不会出现语法错误的,反之则会报语法错误。本身能够试一下。
转载于猿2048:➻《ES2018 新增特性清单》