可选链操作符(?.)是JavaScript中用于安全访问嵌套属性的短路操作符,遇null/undefined即返回undefined而不报错;支持?.prop、?.[key]、?.()三种写法,常与??配合提供默认值。

可选链运算符 ?. 是解决多层嵌套属性访问时“中间值为 null 或 undefined”导致报错的核心方案。它不会抛出错误,而是让整个链在首次遇到无效值时立即返回 undefined。
三种基本写法对应不同访问场景
可选链不是万能钥匙,得按属性访问方式选对语法:
-
?.prop:用于已知属性名的静态访问,比如
user?.profile?.name -
?.[key]:用于动态属性名,比如
user?.settings?.[themeKey],其中themeKey是变量 -
?.():用于安全调用可能不存在的方法,比如
obj?.getData?.(),避免obj.getData is not a function
短路行为决定结果是否为 undefined
可选链一旦在某一层遇到 null 或 undefined,就立刻停止后续访问,整条表达式直接返回 undefined,不再执行右边部分。
例如:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
立即学习“Java免费学习笔记(深入)”;
-
user?.address?.street?.name→ 若user.address是undefined,则整个表达式值为undefined,street和name都不会被读取 -
data?.items?.[0]?.title→ 若data.items不存在或为空数组,[0]不会触发越界错误,也不会尝试读title
配合空值合并 ?? 处理默认值
可选链只负责“不报错”,但返回 undefined 后常需兜底。这时用 ?? 最自然:
-
user?.profile?.nickname ?? '匿名用户'—— 有昵称就用,没有就显示默认值 -
config?.api?.timeout ?? 5000—— 层级深又可能缺失,用 ?? 比三元更简洁、无重复计算
不能滥用:哪些情况不适用
可选链只处理“属性访问失败”,不解决逻辑错误或类型误用:
- 不能代替类型检查:若
user?.age是字符串"25",后续做数学运算仍可能出错 - 不能跳过
undefined之后的非对象值:如user?.score?.toFixed(2),若score是数字没问题,但若它是undefined,则undefined?.toFixed返回undefined,不会报错,但结果可能不符合业务预期 - 不能用于赋值或
delete左侧(user?.name = 'new'语法错误)

















