[TOC]
Dynamic import
不同于 ECMAScript2015 中的静态引入模块,Dynamic import 提供了按需引入、计算模块名称和脚本内部执行,并返回一个promise
const modulePage = 'page.js'; |
Promise.allSettled()
在promise中有两个重要的方法:promise.all() 和 promise.race(),新增的 promise.allSettled() 方法,返回一个在所有给定的promise都已经fulfilled或rejected后的promise,并带有一个对象数组,每个对象表示对应的promise结果。
用法
Promise.allSettled(iterable); |
参数
iterable: 一个可迭代的对象,所有成员都是promise返回值
只要所有的 promise 都已经完成,无论是 resolve 还是 reject ,所有返回的 promise 都会集中为 一个数组, 数组包含每一个 promise 执行的结果。
每一个结果都是一个对象,包含一个
status字符串,值为fulfilled或者rejected,此外,还包含一个 fulfilled 时的value或者 rejected 时的reson。const promise1 = Promise.resolve(3);
const promise2 = new Promise((resolve, reject) => setTimeout(reject, 100, 'foo'));
const promises = [promise1, promise2];
Promise.allSettled(promises).
then((results) => results.forEach((result) => console.log(result)));
// Object { status: "fulfilled", value: 3 }
// Object { status: "rejected", reason: "foo" }
浏览器兼容性

String.prototype.matchAll(RegExp)
以往,当我们使用 String.prototype.match() 方法时,总是返回一个数组,其中包含所有完全匹配的字符串:
const text = "From 2019.01.29 to 2019.01.30"; |
而 matchAll() 还能够返回所有 Regex 捕获组:
const text = "From 2019.01.29 to 2019.01.30"; |
可选链操作符(?.)
访问属性
当要访问嵌套在对象内部的属性时,我们很有可能会遇到这样的错误:
Uncaught TypeError: Cannot read property... |
所以, 当我们需要访问一个属性时,我们经常会这样写以避免错误:
let foo = obj && obj.foo.// 确认 obj 和 obj.foo 都不是 undefined 或 null |
但是即使是这样写也会经常遗漏,且繁琐,如果采用可选链式调用,就可以大量简化这样的前置校验:
let foo = obj ?. foo |
有了可选链操作符(?.),在访问 obj.foo.bar 之前,不再需要明确地校验 obj.foo 的状态,一旦遇到 null 或者 undefined就会返回 undefined。
访问方法
当我们需要尝试调用一个可能不存在的方法时,可以使用可选链来避免返回异常:
let result = obj.someMethod?.();
// ES2019的写法 |
可选链和表达式
使用方括号和属性名的形式来访问属性:
let foo = obj?.['prop' + 'Name'];
访问数组元素:
let item = arr ?. [20];
可选链不能用于赋值
let object = {}; |
浏览器兼容性

空值合并操作符( ?? )
通常,当我们需要为判断变量是否为 null ,并为变量赋值时,我们需要利用 逻辑或操作符(||),当左边为假值时返回右侧操作数:
let foo; |
看上去并没有什么问题,但 || 是一个布尔逻辑运算符,左侧的操作数会被强制转换为布尔值,因此,所有的假值(0, ‘’, NaN, null, undefined)都会被转为 false:
let count = 0; |
而使用空值合并操作符可以避免,只有在第一个操作数为 null 或者 undefined 时,才返回第二个操作数:
let count = 0; |
与可选链式操作符之间的关系
空值合并操作符针对 undefined 与 null 这两个值,可选链式操作符(?.) 也是如此。在这访问属性可能为 undefined 与 null 的对象时,可选链式操作符非常有用。
let foo = { someFooProp: "hi" }; |