可选链操作符?.专为安全访问嵌套属性设计,遇null/undefined立即返回undefined不报错;必须每级显式标注,如a?.b?.c,不可省略中间?.;支持属性、数组索引、动态键名及方法调用三种形式,需严格匹配语法;配合??可精准提供默认值,避免误用&&。

直接用 ?. 就行——它专为安全访问嵌套属性设计,遇到 null 或 undefined 会立刻停止访问,返回 undefined,不报错。
每级都加 ?.,不能跳着写
可选链只对它紧邻左侧的值生效,保护不会自动延续到下一级。比如 a?.b.c 是危险的:虽然 a?.b 安全返回 undefined,但后面的 .c 仍试图从 undefined 上读取,会抛出 TypeError。
- ✅ 正确写法:
a?.b?.c—— 每一层可选都显式标注 - ✅ 若某层必须存在(如 b 存在才允许取 c),应配合条件判断:
if (a?.b) { const c = a.b.c; } - ❌ 错误写法:
a?.b.c、a?.b[0].name(漏了?.[0])
支持三种访问形式,写法不能混用
?. 不是万能前缀,要按访问方式匹配语法:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 对象属性:
user?.profile?.avatarUrl - 数组索引:
list?.[0]?.name(注意是?.[0],不是?[0]或?.[0].) - 动态键名:
obj?.[fieldName](fieldName是变量) - 方法调用:
api?.fetch?.()(?.()表示“存在才调”,不是?.fetch())
搭配 ?? 提供精准默认值
?. 解决“不崩溃”,?? 解决“给什么”。两者天然配合,语义清晰:
-
user?.age ?? 18:没传age用 18;传了0或false也保留原值(??只对null/undefined生效) -
order?.items?.[0]?.name ?? '未知商品':链式取值 + 精准兜底 - 别用
&&替代:user?.name && '匿名'在name是''或0时也会兜底,通常不符合预期
解构时设空对象默认值更省事
批量取深层字段时,用解构 + 默认空对象比连写多个 ?. 更简洁:
const { data = {}, user = {}, profile = {} } = response;- 再从
profile里取:const { avatarUrl = '' } = profile; - 一行写法(适合简单场景):
const { data: { user: { profile: { avatarUrl = '' } = {} } = {} } = {} } = response;
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










