可选链操作符?.是安全访问嵌套属性的语法,遇null/undefined即短路返回undefined;支持obj?.prop、obj?.[expr]、func?.(args)三种形式;不可赋值或用于new后;常与??组合提供默认值。

可选链操作符 ?. 是什么
它是一种安全访问嵌套对象属性的语法,避免在某个中间层级为 null 或 undefined 时抛出 TypeError。本质是「遇到空值就短路返回 undefined,不继续执行后续属性访问」。
用 ?. 替代手动判空的典型场景
比如读取 user.profile.address.city,传统写法要层层检查:
const city = user && user.profile && user.profile.address && user.profile.address.city;
用可选链后直接写:
const city = user?.profile?.address?.city;
两者行为一致,但后者更简洁、可读性更高,且不会因漏掉某一层判断导致运行时错误。
立即学习“Java免费学习笔记(深入)”;
?. 的三种合法使用形式及注意事项
它只能出现在以下位置,其他地方会报语法错误:
-
obj?.prop—— 访问属性(最常用) -
obj?.[expr]—— 动态属性名,expr必须能求值,比如obj?.[key] -
func?.(args)—— 调用函数,仅当func是函数时才执行;若为null/undefined,整个表达式返回undefined,且args不会被求值
注意:?. 不能用于左侧赋值(如 obj?.prop = 1 报错),也不能跟在 new 后面(new Constructor?.() 不合法)。
和空值合并操作符 ?? 配合使用的常见模式
可选链返回 undefined 时,常紧接着用 ?? 提供默认值,避免后续逻辑出错:
const name = user?.profile?.name ?? 'Anonymous';
这比 || 更安全——例如当 name 是空字符串或 0 时,?? 仍保留原值,而 || 会误触发默认值。
容易忽略的一点:链中任意一环为 undefined 或 null 就终止,但不会跳过 undefined 去尝试原型链上的同名属性;它只做存在性检查,不触发属性查找委托。











