js 一分钟掌握可选链用法

前言

随着工作中遇到的场景越来越多,我们会发现大多时候数据结构无非就是对象以及数组,很多时候我们判断层层嵌套的属性时必须要确保上一级属性存在,可是这样往往代码看起来比较冗长,因此可选链这个小知识我们需要掌握。

使用场景

    const data1 = {
        detail: {
            name: 'name'
        }
    }

    const data2 = {}

    const name1 = data1.detail.name // 'name'

    const name2 = data2.detail.name // Uncaught TypeError: Cannot read properties of undefined (reading 'name')

name1一切都是正常的。

name2我们获取name,期望的值是undefined,但是它直接报错了,原因是因为data2上并不存在detail属性,因此detail应该是undefined,我们不能在undefined类型上去获取name属性。

那我们可以怎么做呢?在可选链出来之前我们是这么做的:

    const name2 = data2.detail && data2.detail.name // undefined

我们要先判断data2上的detail值,确保它存在才会去获取name属性。

如果data2.detail已经为undefined了,则&&运算符不会继续判断data2.detail.name

但是这样看起来并不优雅,于是可选链就顺应需要出现了:

    const name2 = data2.detail?.name // undefined

?.会判断前面的对象是否存在,若它为underfined或者null,则直接返回underfined

这样我们就不必在获取name时判断detail的存在了。

方法同样可以使用可选链

    const test1 = {
        getName: () => {
            return 'name1'
        }
    }

    const test2 = {}

    const name1 = test1.getName() // 'name1'

    const name2 = test2.getName() // Uncaught TypeError: test2.getName is not a function

    const name3 = test2.getName?.() // underfined

可选链默认值

我们前面知道了,可选链会在前面的对象不存在时返回undefined,实际上我们可以使用??运算符改变它的默认值,让它在undefined或者null时,得到一个备用的值。

    const data = {}

    console.log(data.detail?.name ?? '默认name') // '默认name'

值得注意的是,??不止是判断了可选链前面的对象detail,即便detailname都存在,只要name的值也为undefined或者null,表达式也会使用默认值。

换一种说法,也就是??判断了前方表达式最终的值,只要是undefined或者null,表达式就会使用默认值。

    const data = {
        detail: {
            name: null
        }
    }

    console.log(data.detail?.name ?? '默认name') // '默认name'

尾言

如果觉得文章对你有帮助的话,欢迎点赞收藏哦,有什么错误或者意见建议也可以留言,感谢~

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

在下月亮有何贵干

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值