可选链操作符(?.)是es2020引入的安全访问机制,遇null或undefined时立即返回undefined而非报错,适用于属性访问、方法调用和数组索引,并需配合空值合并操作符(??)提供默认值以确保逻辑健壮。

JavaScript 中对 null 或 undefined 做链式访问时,会直接报错(如 Cannot read property 'x' of null)。要安全处理空值链式操作,核心是避免在 null 或 undefined 上取属性或调用方法。
使用可选链操作符(?.)
ES2020 引入的 ?. 是最简洁、推荐的方式,它会在左侧值为 null 或 undefined 时立即返回 undefined,不再继续执行后续访问。
-
obj?.user?.name→ 若obj或user为null/undefined,整个表达式返回undefined,不报错 -
arr?.[0]?.id→ 安全访问数组首项的id -
fn?.(arg)→ 安全调用函数(仅当fn存在且为函数时执行)
结合空值合并操作符(??)提供默认值
?? 在左侧为 null 或 undefined 时返回右侧默认值,常与 ?. 配合使用,让逻辑更健壮。
-
obj?.settings?.theme ?? 'light'→ 获取主题,缺失时用'light' -
user?.profile?.age ?? 0→ 确保得到数字类型,默认为0
兼容旧环境的替代写法
若需支持不支持 ?. 的老版本浏览器(如 IE),可用逻辑运算符或短路判断模拟:
-
obj && obj.user && obj.user.name→ 传统方式,但较冗长 -
(obj || {}).user && (obj.user || {}).name→ 避免报错,但可读性差 - 封装工具函数:
get(obj, 'user.name', 'default'),类似 Lodash 的_.get
注意边界情况
?. 只检查「当前层级」是否为空,不保证深层结构存在;同时它不会阻止 TypeError(比如对非对象类型用 ?. 访问属性是允许的,但对 number 调用方法仍会报错)。
-
123?.toString()✅ 合法(123是原始值,但 JS 会临时包装) -
null?.foo()✅ 返回undefined,不报错 -
obj?.foo.bar❌ 若obj?.foo是undefined,整体为undefined,不会报错
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











