可选链操作符(?.)的核心作用是安全访问深层嵌套属性,遇null/undefined即短路返回undefined,避免报错;支持对象属性、数组索引、动态键名和方法调用,需搭配??提供默认值,不可用于赋值且变量必须已声明。

可选链操作符 ?. 的核心作用,就是让你在读取嵌套属性时,不必写一长串 && 判断,也不会因为中间某一层是 null 或 undefined 就直接报错 Cannot read property 'x' of undefined。
怎么用 ?. 安全读取深层属性
只要在任意访问操作前加 ?.,整条链就会在遇到 null 或 undefined 时立刻返回 undefined,不再继续向下访问。
- 对象属性链:
user?.profile?.settings?.theme——若user是undefined,后面整段不执行,直接得undefined - 数组索引访问:
list?.[0]?.name——即使list是空数组、null或未定义,也不报错 - 动态键名:
obj?.[key]——注意key本身必须已声明且非null/undefined,否则变成obj?.[undefined],这不是可选链能拦截的 - 方法调用:
api?.fetch?.()——先查api存在,再查fetch是函数,都满足才调用;任一环节缺失,返回undefined
为什么不能只靠 ?.,还得搭配 ??
?. 只负责“不断链”,不负责“给兜底值”。它返回的 undefined 在业务中往往不可用,所以通常要接空值合并操作符 ?? 提供默认值。
- 正确写法:
user?.avatar ?? '/default.png'、config?.timeout ?? 3000 - 别用
||替代:user?.count || 0在count是0时也会 fallback,语义错误;??只在左侧是null或undefined时生效
哪些坑必须避开
- 不能赋值:
obj?.name = 'Alice'是语法错误,?.只用于读取 - 不能独立使用:
?.prop或let x = ?.都非法 - 变量必须已声明:没写
const user = {}就直接用user?.name,会抛ReferenceError - 不保护 key 的有效性:
obj?.[someKey]中,若someKey是undefined,实际访问的是obj?.[undefined],这仍可能触发意外行为
什么时候该用,什么时候该警惕
- 适合场景:解析 API 响应(字段可能缺失)、读取用户可选配置、处理
localStorage中的松散结构数据 - 要谨慎的场景:如果某个顶层对象按业务逻辑必须存在(例如登录后
currentUser不应为undefined),那就该写currentUser.address?.city,而不是currentUser?.address?.city——这样能让顶层意外为空的问题更快暴露,便于调试和定位根本原因
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











