可选链操作符?.是安全访问嵌套属性的语法,当左侧为null或undefined时直接返回undefined而非报错;支持属性访问(obj?.prop)、方法调用(obj?.method())和数组索引(arr?.[index]),不适用于赋值左侧或跨函数异常捕获。

可选链操作符 ?. 是什么
它是一种安全访问嵌套对象属性的语法,当左侧操作数为 null 或 undefined 时,立即返回 undefined,不再继续执行右侧访问。不是“防止报错”的兜底机制,而是让访问行为本身变成短路表达式。
它能避免 Cannot read property 'x' of null/undefined
这是最常见的运行时错误,发生在尝试读取 null 或 undefined 的属性时。用 ?. 替代 . 后,这类错误直接消失——表达式结果为 undefined,而非抛出异常。
- 错误写法:
const name = user.profile.name;
(若user或user.profile为null就崩) - 安全写法:
const name = user?.profile?.name;
(任一环节为null/undefined,结果就是undefined)
?. 支持哪些访问形式
它不是只用于点号属性访问,还覆盖三种常见场景,每种都有对应语法:
- 属性访问:
obj?.prop - 方法调用:
obj?.method()(仅当obj.method是函数才执行;若obj为空或obj.method不存在,不报错、不执行) - 数组索引:
arr?.[index](arr为空时跳过索引访问)
注意:?. 不能用于赋值左侧(如 obj?.prop = 1 会报语法错误),也不能链式用于 new 或模板字符串中。
立即学习“Java免费学习笔记(深入)”;
和逻辑运算符 && 比有什么区别
过去常用 obj && obj.profile && obj.profile.name 做防御,但这种写法有隐患:
- 如果中间某个值是 falsy(比如
0、''、false),整个表达式就短路返回那个 falsy 值,而不是继续往下取 —— 这可能掩盖真实数据 -
?.只在null和undefined时短路,其他 falsy 值照常参与访问 -
?.更简洁、意图更明确,且支持方法调用和动态索引等&&无法自然表达的场景
真正容易被忽略的是:可选链不能跨函数作用域“穿透”——比如 fn()?.prop 中,若 fn() 抛错,?. 完全不生效;它只处理值为 null/undefined 的情况,不捕获异常。










