「前端每日一问(43)」用过可选链操作符( ?.) 吗?

251 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第6天,点击查看活动详情

本题难度:⭐

答:

可选链操作符(  ?.  )允许读取位于连接对象链深处的属性的值,而不必明确验证链中的每个引用是否有效。

当尝试访问可能不存在的对象属性时,可选链操作符将会使表达式更短、更简明。

你是否经常遇到过这种问题,后端给你返回的数据本来是一个对象,但是它给你返回了一个默认值 null

const res = {
  data: {
    userInfo: null
  }
}

const userInfo = res.data.userInfo

console.log(userInfo.name)

比如上面代码示例中,访问 userInfo.name,就报错了。

image.png

然后 js 代码被阻断,整个页面白屏了,然后用户反馈系统崩溃了,然后领导开始疯狂批斗你。

遇到这样的线上 bug,着实令人很无语,充分相信了后端返回的数据,结果后端捅了你一刀。

要解决这个问题,可以这么写:

const res = {
  data: {
    userInfo: null
  }
}

const userInfo = res.data.userInfo

console.log(userInfo && userInfo.name) // 先判断一下有没有 userInfo,有才执行后面逻辑

但是后端返回的数据总会出其不意,有时候 res 可能为 null ,res.data 也可能为 null,为了防止可能出现的bug,你可能会写出类似的代码:

const userName = res && res.data && res.data.userInfo && res.data.userInfo.userName

这样的代码写出来着实非常令人难受😣。

其实,JS 有解决这种问题的方案,可以用可选链操作符(  ?.  )来解决类似问题。

const res = {
  data: {
    userInfo: null
  }
}

const userInfo = res.data.userInfo

console.log(userInfo?.name) //注意这里的写法

遇到多层的情况,每一层都可以加可选链操作符:

const userName = res?.data?.userInfo?.userName

caniuse 上查一下兼容性,chrome >= 80 才行,不是很好。

image.png

但是现在的前端项目一般都引了 babel,去 babel 上测试一下,一般比较标准化的配置是支持的,所以兼容性问题不是很担心。

image.png

结尾

可选链的写法确实非常 nice 的,但是有时候忘了写,还是可能会中招,要根治这样的问题,还是得用 TS。

推荐一篇我的文章,可以由浅入深地学习 TS。

「1.9W字总结」一份通俗易懂的 TS 教程,入门 + 实战!

阿林水平有限,文中如果有错误或表达不当的地方,非常欢迎在评论区指出,感谢~

如果我的文章对你有帮助,你的👍就是对我的最大支持^_^

你也可以关注《前端每日一问》这个专栏,防止失联哦~

我是阿林,输出洞见技术,再会!

上一篇:

「前端每日一问(42)」this 指向谁?

下一篇:

「前端每日一问(44)」用过空值合并运算符 (??)吗?