一文详解JavaScript中?.(可选链操作符)和??(空值合并操作符)的用法

 更新时间:2026年02月12日 08:38:36   作者:SuperEugene  
这篇文章主要为大家详细介绍了JavaScript中?.(可选链操作符)和??(空值合并操作符)的用法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下

引言

这是一段我看从别人的Axios代码里看到的代码片段

const msg = error.response?.data?.msg ?? error.response?.data?.message ?? error.message

起初这个?的用法,我只在定义接口的时候用过

export interface UserInfo {
  id: string 
  pwd: string  // 密码
  nickname: string // 用户名称
  wechatCode?: string  // 微信号
}

表示:wechatCode是可选的,有也行没有也行。其他的都是一定要有的。

error.response?.data 我还能理解,表示error中是否有response,如果有就再.data如果没有就返回嘛。但是??我就不能理解啦。怀揣着好奇心学习了一下,分享给同样不知道的同学们。

一、关键语法讲解

1.可选链操作符 ?.

  • 作用:安全地访问嵌套对象的属性,如果访问路径上的某个属性是 nullundefined,不会报错,而是直接返回 undefined
  • 传统写法:如果直接写 error.response.data.msg,如果 error.responseundefined,会抛出 Cannot read properties of undefined (reading 'data') 错误。
  • 可选链写法:error.response?.data?.msg 会先检查 error.response 是否存在(非 null/undefined),存在才继续访问 data,再检查 data 存在才访问 msg,任何一步不存在就返回 undefined

2.空值合并操作符 ??

作用:只在左边的值是 nullundefined 时,才返回右边的值(区别于 |||| 会把 ''0false 等 “假值” 也判定为无效)。

  • 例子:
    • undefined ?? '默认值'返回 '默认值'
    • '' ?? '默认值'返回 ''(因为 '' 不是 null/undefined)。
  • 对比 ||'' || '默认值'返回 '默认值',这是两者的核心区别。

二、整行代码分析

const msg = error.response?.data?.msg ?? error.response?.data?.message ?? error.message

这行代码的核心目的是:按优先级从 error 对象中提取错误提示信息,确保最终拿到一个有效的、非空的错误文本,查找优先级如下:

1、第一优先级:error.response?.data?.msg 先尝试从 errorresponse.data 里找 msg 属性(很多后端接口返回的错误信息字段是 msg)。

2、第二优先级:error.response?.data?.message 如果第一步的结果是 null/undefined(比如接口返回的错误字段是 message 而不是 msg),就尝试找 response.data 里的 message 属性。

3、最后兜底:error.message 如果前两步都没找到(比如没有 response 层级,比如前端自身抛出的错误),就取 error 本身的 message 属性(JS 原生 Error 对象默认有 message 字段)。

三、举例子讲解加深印象

const msg = error.response?.data?.msg ?? error.response?.data?.message ?? error.message

还是这个代码,用三种不同的接口情况返回让你更好的理解。下面的三个例子要和这条代码对照起来看。

假设有三种不同的 error 结构,看 msg 的取值结果:

例子 1:接口返回 msg 字段

const error = {
  response: {
    data: { msg: '用户名已存在' }
  }
};
// 执行代码后,msg = '用户名已存在'(取第一优先级)

例子 2:接口返回 message 字段

const error = {
  response: {
    data: { message: '密码错误' }
  }
};
// 第一步 msg 是 undefined → 第二步取 message → msg = '密码错误'

例子 3:前端原生错误(无 response 层级)

const error = new Error('网络请求超时');
// 前两步都是 undefined → 取 error.message → msg = '网络请求超时'

四、总结

  • ?. 是为了安全访问嵌套属性,避免因某个属性不存在导致代码报错;
  • ?? 是为了精准判断 “无值”(仅 null/undefined),优先使用接口返回的错误信息,兜底用原生错误信息;
  • 整行代码的核心逻辑是:按 msgmessage(接口层级)→ message(错误对象层级)的优先级,提取有效的错误提示文本。
const msg = error.response?.data?.msg ?? error.response?.data?.message ?? error.message

通过本次学习,再结合案例分析一下。这个写法似乎是前端处理异步请求(如 Axios)错误信息的常用最佳实践,能兼容不同格式的错误返回,保证代码的健壮性。

到此这篇关于一文详解JavaScript中?.(可选链操作符)和??(空值合并操作符)的用法的文章就介绍到这了,更多相关JavaScript ?.和??用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JavaScript运动减速效果实例分析

    JavaScript运动减速效果实例分析

    这篇文章主要介绍了JavaScript运动减速效果,模拟了物体做减速运动的效果,以两个实例形式分析了javascript实现物体做减速运动的实现技巧,涉及javascript动态操作页面元素样式及数学运算的方法,非常简洁实用,需要的朋友可以参考下
    2015-08-08
  • JavaScript命名空间模式实例详解

    JavaScript命名空间模式实例详解

    这篇文章主要介绍了JavaScript命名空间模式,结合实例形式分析了javascript命名空间模式的相关概念、原理、实现方法及操作注意事项,需要的朋友可以参考下
    2019-06-06
  • 20个你不得不知道的js位运算用法

    20个你不得不知道的js位运算用法

    位运算,那些看似晦涩但又蕴含无限魔力的数字魔术,在JavaScript开发中扮演了默默无闻却又至关重要的角色,本文介绍多个js位运算的使用场景,阐述在JavaScript中,如何巧妙运用位运算实现效率的提升和算法的优化,需要的朋友可以参考下
    2023-12-12
  • JS求1到任意数之间的所有质数的方法详解

    JS求1到任意数之间的所有质数的方法详解

    这篇文章主要介绍了JS求1到任意数之间的所有质数,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2019-05-05
  • webpack自定义loader全面详解

    webpack自定义loader全面详解

    这篇文章主要为大家介绍了webpack自定义loader全面详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • 浅析JavaScript原型继承的陷阱

    浅析JavaScript原型继承的陷阱

    JavaScript和其它面向对象语言一样,对象类型采用引用方式。持有对象的变量只是一个地址,而基本类型数据是值。当原型上存储对象时,就可能有一些陷阱
    2013-12-12
  • Bootstrap 3多级下拉菜单实例

    Bootstrap 3多级下拉菜单实例

    这篇文章主要为大家详细介绍了Bootstrap 3多级下拉菜单实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • Json Web Token在前后端实践思考分析

    Json Web Token在前后端实践思考分析

    这篇文章主要为大家介绍了Json Web Token在前后端实践思考分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • javascript 代码是如何被压缩的示例代码

    javascript 代码是如何被压缩的示例代码

    这篇文章主要介绍了javascript 代码是如何被压缩的,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • moment.js使用超详细教程

    moment.js使用超详细教程

    Moment.js是一个轻量级的JavaScript时间库,它方便了日常开发中对时间的操作,提高了开发效率下,本文给大家介绍moment.js使用超详细教程,感兴趣的朋友跟随小编一起看看吧
    2023-10-10

最新评论