可选链(?.)用于安全访问深层嵌套属性,遇 null/undefined 即停并返回 undefined;支持点号、方括号、函数调用和数组索引;需搭配 ?? 提供默认值,不可用于赋值或掩盖本应存在的结构问题。

用 ?. 访问深层嵌套属性,核心是“遇空即停、不报错、返回 undefined”。它不是万能兜底,而是为明确“该属性可能不存在”而设计的精准工具。
直接替换点号,逐层加 ?. 即可
把传统写法中每个 . 替换成 ?. ,就能自动跳过 null/undefined 中间层:
- 传统写法:
user && user.profile && user.profile.address && user.profile.address.city - 可选链写法:
user?.profile?.address?.city
只要 user、profile 或 address 中任意一个为 null 或 undefined,整个表达式立刻返回 undefined,后续不再执行。
支持方括号、函数调用和数组索引
可选链不止用于 .prop,还能覆盖更灵活的访问场景:
- 动态属性名:
obj?.['user-name'](适合含连字符或变量名) - 安全调用方法:
data?.getItems?.()(先确认方法存在再执行) - 安全取数组项:
list?.[0]?.name(确保 list 存在且首项非空)
搭配 ?? 提供默认值,避免假值误覆盖
?. 只负责不报错,返回 undefined;真正需要兜底时,用 ?? 接住:
const city = user?.profile?.address?.city ?? '未知城市';-
??只在左侧为null或undefined时生效,不会把0、false、''当成空而替换——比||更准确。
注意边界:不能赋值,也不掩盖设计问题
可选链只适用于读取场景,有明确限制:
- ❌ 不可用于赋值:
user?.profile = {}是语法错误 - ❌ 不应替代本该存在的结构校验:如果
profile按接口定义必须存在,却用了user?.profile,反而会掩盖数据异常 - ❌ 方法调用带副作用时需谨慎:如
api?.fetch?.()若fetch不存在,请求就不会发——这可能是预期行为,也可能是逻辑漏洞,要结合业务判断










