JavaScript中可选链操作符(?.)用于安全访问可能为null或undefined的嵌套属性或方法,返回undefined而不报错,支持多层链式调用,并可与??配合提供默认值,但不可用于赋值。

JavaScript 中链式调用遇到可能为 null 或 undefined 的中间属性时,用可选链操作符(?.)可以安全跳过,避免报错。
基本语法:用 ?. 替代 .
当访问嵌套对象属性或调用方法时,在不确定某一层是否存在的地方插入 ?.:
-
obj?.prop:如果obj是null或undefined,整个表达式返回undefined,不报错 -
obj?.method():只在obj存在且method是函数时才调用,否则返回undefined -
arr?.[index]:安全访问数组索引,arr为空时也不报错
链式调用中多层可选访问
多个 ?. 可连用,形成真正“安全的链式”:
const userName = user?.profile?.name?.toLowerCase();
等价于手动判断:
立即学习“Java免费学习笔记(深入)”;
const userName = user && user.profile && user.profile.name ? user.profile.name.toLowerCase() : undefined;
只要其中任意一环是 null 或 undefined,后续不再执行,直接返回 undefined。
和空值合并操作符 ?? 配合使用
可选链返回 undefined 时,常配合 ?? 提供默认值:
const city = user?.address?.city ?? '未知城市';</li> <li><code>const items = data?.list?.filter(x => x.active) ?? [];</li> </ul> <p>注意:<code>??
只在左侧为null或undefined时生效,不会被false、0、''触发。限制与注意事项
可选链不能用于赋值或作为左值:
- ❌
obj?.prop = value(语法错误) - ❌
obj?.[key] = value(语法错误) - ✅ 但可以用于读取后赋值:
const tmp = obj?.prop; tmp && (tmp.value = 'ok');
函数调用需确保是“可选调用”,即写成
func?.(),而不是func()后加?.;若函数本身可能不存在,必须把?.放在括号前。- ❌


















