ES系列总结(六)

2,361 阅读4分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

1. 可选链路操作符

Optional Chaining

1.1 简介

在业务开发中,如果读取对象内部的某个属性,往往需要判断一下该对象是否存在。比如,直接读取接口中的一个名字的字段name,它处于对象中很深的层级如 res.data.info.name,安全的写法是写成下面这样。

const name = (res && res.data && res.data.info && res.data.info.name) || 'defaultName'

上面例子中,name 属性在对象的第四层,所以需要判断四次,去校验每一层是否有值。

这样的层层判断非常繁琐,因此 ES2020 引入了“可选链操作符”来简化上面的写法, 改写后的语法如下。

const name = res?.data?.info?.name || 'defaultName'

1.2 基本使用

let myMap = new Map()
myMap.set('artist', { name: 'Alice', age: 23 })
myMap.get('doctor')?.name // undefined
myMap.get('artist')?.name // 'Alice'

表达式在对象中的取值

let obj = { food1: 'aaa', food2: 'bbb' }
    prop = 'food'
    type = '2'
let nestedProp = obj?.[prop + type] // 'bbb'

函数调用

const Fn = () = > {console.log('run')}
let result = Fn?.() // 'run'

访问数组

const arr = [1,2]
let arrayItem = arr?.[42] // undefined

短路计算

当在表达式中使用可选链时,如果左操作数是 nullundefined,表达式将不会被计算,例如:

let left = null
let i = 0
let result = left?.[i++]
 
console.log(i) // i 将不会被递增,仍然输出 0

delete 运算符

和短路计算类似,当左操作数是nullundefined,将直接返回undefined,而不进行delete 运算。

delete a?.b

2. 空值合并操作符

Nullish Coalescing

2.1 简介

当读取对象属性的时候,有时候需要为它们指定默认值。常见做法是通过||运算符来实现。

const object = { test: 0 }
const text = object.test || 'Hello World~' // 'Hello World~'

而有时候在开发中,可能只想要给属性值为nullundefined的情况设置默认值,也就是保持属性值为0、false和''的情况。

这个时候就可以用到ES11的新特性-空值合并操作符, 写做??。空值合并操作符是一个 逻辑操作符,当左操作数为nullundefined的时候,返回右侧操作数

2.2 基本使用

const object = { test: 0, test2: null }
const text = object.test ?? 'Hello World~' // 0
const text2 = object.test2 ?? 'Hello World~' // 'Hello World~'

短路计算

如果左操作数是 nullundefined,表达式将不会被计算,例如:

function foo() {
  console.log('调用 foo')
}
console.log(false ?? foo()) // foo未执行
console.log(undefined ?? foo()) // '调用foo'
和逻辑操作符共同使用时,需要加上()以区分
const small = true, medium = false, huge = true;
small && medium ?? huge // 报错
small ?? medium || huge // 报错
加上表明优先级
(small && medium) ?? huge // false
small ?? (medium || huge) // true

3. Promise.allSettled

3.1 简介

首先回顾Promise.all是ES6的方法,用于接受多个promise实例,当所有实例的状态都变为fulfilled时,返回一个结果数组;当有一个实例状态变为reject时则返回Promise.reject,其他请求的结果将不再正常返回。

有的时候我们希望哪怕有实例状态变为了reject,其他请求的结果依然能正常返回,对于这种情况,ES2020就引入了Promise.allSettled()方法。

3.2 基本使用

const promise1 = new Promise((resolve, reject) => setTimeout(reject, 200, 'reject'))
const promise2 = new Promise((resolve, reject) => setTimeout(resolve, 300, 'resolve'))
const promises = [promise1, promise2]
 
Promise.allSettled(promises).then((res) => res.forEach((item) => console.log('result', item)))
// result {status: "rejected", reason: "reject"}
// result {status: "fulfilled", value: "resolve"}

该方法返回一个新的Promise实例,传入的参数依然是装有多个primse实例的数组,并且结果总是fulfilled状态。有时候我们不关心异步操作执行的结果,而只关心这些操作有没有结束,这时就可以尝试使用Promise.allSettled()方法。

点赞支持、手留余香、与有荣焉,动动你发财的小手哟,感谢各位大佬能留下您的足迹。

11.png

往期精彩推荐

前端常用的几种加密方法

canvas 爬坑路【方法篇】

不懂 seo 优化?一篇文章帮你了解如何去做 seo 优化

canvas 爬坑路【属性篇】

【实战篇】微信小程序开发指南和优化实践

聊一聊移动端适配

前端性能优化实战

聊聊让人头疼的正则表达式

获取文件blob流地址实现下载功能

Vue 虚拟 DOM 搞不懂?这篇文章帮你彻底搞定虚拟 DOM

Git 相关推荐

通俗易懂的 Git 入门

git 实现自动推送

面试相关推荐

前端万字面经——基础篇

前端万字面积——进阶篇

更多精彩详见:个人主页