前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何优雅判断属性值为空

如何优雅判断属性值为空

作者头像
前端达人
发布2019-12-24 13:36:55
3.9K0
发布2019-12-24 13:36:55
举报
文章被收录于专栏:前端达人前端达人
想必类似的 Bug 大家肯定遇见过

这是因为我们尝试从 undefined 或者 null 中取出数据。

解决这种问题其实很简单,假如我们有如下对象:

代码语言:javascript
复制
const a = {
  b: {
    c: 1
  }
}

假设我们现在需要取出 a.b.c,但是并不清楚它们是否都存在,那么代码会写成这样:

代码语言:javascript
复制
if (a && a.b) {
  const c = a.b.c
}

其实这样的代码在项目中出现的频率是很高的,如果需要取的值层级过深的话,代码也会写的很恶心,那么我们是否可以优雅的来解决这个呢?

解决办法肯定是有的啦,就是使用新语法可选链。

不过这个语法当下还没有正式发布,但是我们可以通过安装 Babel 插件去使用它。

代码语言:javascript
复制
npm install --save-dev @babel/plugin-proposal-optional-chaining

安装完毕后修改下 Babel 配置文件即可。

代码语言:javascript
复制
{
   "plugins": ["@babel/plugin-syntax-optional-chaining"]
}

接下来我们就可以使用可选链将上述的代码改造成这样:

代码语言:javascript
复制
const c = a?.b?.c

Babel 会将代码编译成这样:

代码语言:javascript
复制
const c = a === null || a === null ? undefined : a.b === null || a.b === undefined ? undefined : a.b.c

虽然编译后的代码看着有点啰嗦,但是确实很优雅的解决了判空的问题。

不过可选链在某些场景下还是存在坑的,比如如下代码:

代码语言:javascript
复制
const a = {
  b: {
    c: false
  }
}

假如说我们希望在取值 a.b.c 中给 c 设置一个默认值 true

代码语言:javascript
复制
// true
const c = a?.b?.c || true

但是在这个场景下就会出现 Bug,预期值是 false,结果答案为 true

解决这个问题也很简单,再引入一个新语法双问号即可。这个语法的作用和 || 是类似的,但是只有当取值为 null 或者 undefined 时才会使用默认值。

代码语言:javascript
复制
// false
const c = a?.b?.c ?? true

同样双问号也并没有正式发布,但是也是可以通过 Babel 插件解决问题的,具体的安装这里就不过多赘述了。

以上就是本文的内容,说句题外话,感觉以后 JS 代码中会被各种问号所占据。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-12-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端达人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档