持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情
ECMAScript 2018 特性
最初的JavaScript版本号是ES5(2009)和ES6(2015)。从2016年开始,版本按年份命名:ECMAScript 2016、2017、2018、2019。
本章介绍 ECMAScript 2018 中的新特性:
for await...of
for await...of语句创建一个循环
该循环遍历异步可迭代对象以及同步可迭代对象,包括:内置的 String, Array,类似数组对象 (例如 arguments 或 NodeList),TypedArray, Map, Set 和用户定义的异步/同步迭代器。它使用对象的每个不同属性的值调用要执行的语句来调用自定义迭代钩子。 - 它使用对象的每个不同属性的值调用要执行的语句来调用自定义迭代钩子。
- 类似于
await运算符一样,该语句只能在一个async function 内部使用。
备注:
for await...of不适用于不是异步可迭代的异步迭代器。
示例语法
function test(time) {
return new Promise((resolve, reject) => {
setTimeout(function () {
resolve(time)
},time)
})
}
async function demo() {
let arr = [test(2000), test(100), test(3000)]
for await(let item of arr) {
console.log(item)
}
}
test()
// 2000
// 100
// 3000
Promise.prototype.finally()
finally()方法返回一个Promise- 无论结果是 fulfilled 或者是 rejected,都会执行指定的回调函数。
- 这避免了同样的语句需要在 then() 和 catch() 中各写一次的情况。
- 值得一提的是 虽然与
.then(onFinally, onFinally)类似- 但是
finally()并没有回调参数:由于无法知道 promise 的最终状态,所以 finally 的回调函数中不接收任何参数
- 但是
备注: 在 finally 回调中 throw(或返回被拒绝的 promise)将以 throw() 指定的原因拒绝新的 promise.
示例语法
let isLoading = true;
function test(time) {
return new Promise((resolve, reject) => {
setTimeout(function () {
resolve(time)
},time)
})
}
test(100)
.then(function(json) { /* process your JSON further */ })
.catch(function(error) { console.log(error); })
.finally(function() { isLoading = false; });
对象展开
这使我们能够破坏对象并将剩余的属性收集到一个新对象上:
let { x, y, ...z } = { x: 1, y: 2, a: 3, b: 4 };
x; // 1
y; // 2
z; // { a: 3, b: 4 }