可选链运算符(?.)用于安全访问深层嵌套属性,避免因 null/undefined 报错;支持属性、动态键、数组索引及方法调用;需配合 ?? 提供默认值;不可用于赋值或独立使用,且变量须已声明。

可选链运算符(?.)的核心作用,就是让你在读取深层嵌套属性时,不用写一长串 && 判断,也不会因为中间某一层是 null 或 undefined 而直接报错 Cannot read property 'x' of undefined。
直接用 ?. 替代逐层判断
传统方式要层层校验:
user && user.profile && user.profile.settings && user.profile.settings.theme
用可选链一句话搞定:
user?.profile?.settings?.theme
只要 user、profile、settings 中任意一个为 null 或 undefined,整个表达式立刻返回 undefined,不继续往下访问。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
支持多种访问形式
不只是点号属性访问,它覆盖常见读取场景:
-
对象属性:
data?.response?.body?.items?.[0]?.id -
动态属性名:
obj?.[key](注意:key本身不能是null/undefined) -
数组索引:
list?.[2]?.name(即使list是空数组或undefined,也不报错) -
方法调用:
api?.fetch?.()(如果fetch不存在或不是函数,返回undefined,不抛错)
配合 ?? 提供默认值
?. 只负责“安全访问”,不负责“兜底”。需要默认值时,用空值合并操作符 ??:
user?.profile?.avatar ?? '/default-avatar.png'config?.timeout ?? 5000
⚠️别用 || 替代 ??:如果属性值是 0、false 或空字符串,|| 会误判为“假值”而触发 fallback,语义错误。
避开常见陷阱
几个容易出错的地方要注意:
- 不能用于赋值:
obj?.a = 123❌ 语法错误 - 不能独立使用:
?.prop或let x = ?.❌ 语法错误 - 变量必须已声明:
user?.name前得有let user或类似声明,否则ReferenceError - 只保护对象本身,不保护 key 值:
obj?.[someKey]中,如果someKey是undefined,会变成obj?.[undefined]—— 这不是可选链能拦截的
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










