可选链操作符(?.)解决深层嵌套属性访问时因NULL/undefined导致的运行时错误问题,通过自动短路返回undefined,避免层层判空;支持属性访问、方法调用、数组索引,并常与??配合提供精准默认值。

javaScript 可选链操作符(?.)是一种安全访问嵌套对象属性或调用方法的语法,它能在遇到 null 或 undefined 时自动停止访问,返回 undefined 而不是抛出错误。
可选链解决什么问题?
在没有可选链之前,访问深层嵌套属性(比如 user.profile.address.city)需要层层判断:
❌ 容易出错的写法:
if (user && user.profile && user.profile.address) { console.log(user.profile.address.city); }
稍有遗漏就会触发 Cannot read Property 'address' of undefined 错误。可选链让这种检查变得简洁、自动。
立即学习“Java免费学习笔记(深入)”;
基本用法:安全读取属性和方法
在属性名或括号前加 ?.,只要左侧值是 null 或 undefined,整个表达式立刻返回 undefined,不再继续执行。
- 访问属性:
user?.profile?.address?.city—— 中间任意一环为null/undefined,结果就是undefined - 调用方法:
obj?.method?.()—— 如果obj或method不存在,不报错,返回undefined - 访问数组元素:
arr?.[index]—— 若arr为空,不会报TypeError
配合空值合并操作符(??)设置默认值
可选链常和 ?? 搭配使用,让逻辑更健壮:
const city = user?.profile?.address?.city ?? '未知城市';
这样既避免了错误,又提供了兜底值,比用 || 更准确(因为 ?? 只在 null/undefined 时生效,不会误判 0、false、'' 等假值)。
注意事项和边界情况
可选链只对 null 和 undefined 敏感,其他值(包括 0、false、'')都会继续执行。
-
obj?.prop中如果obj是{ prop: null },结果是null(不是undefined),因为?.只检查左侧是否为空,不检查属性值本身 - 不能用于赋值左侧:
obj?.prop = value会报语法错误 - 不能跨函数作用域穿透:
fn()?.prop是合法的,但fn()?.()表示“如果fn()返回一个函数,就调用它”,不是“可选地调用fn”
基本上就这些。它不复杂,但能大幅减少防御性代码,让嵌套访问更直观、更可靠。