可选链操作符(?.)的核心作用是安全访问嵌套属性,遇null/undefined立即返回undefined而不报错;支持对象属性、动态键名、数组索引和方法调用;需配合??设默认值,禁用于赋值、独立使用或未声明变量。

可选链操作符(?.)的核心作用,是让你在读取嵌套属性时,不用写一长串 && 判断,也不会因为中间某一层是 null 或 undefined 而直接报错。
支持多种访问形式
它不只是替代点号访问,而是覆盖日常读取嵌套数据的常见场景:
- 对象属性:如
user?.profile?.settings?.theme - 动态键名:如
obj?.[key](注意:key本身必须已声明且非null/undefined) - 数组索引:如
list?.[0]?.name(即使list是空数组或undefined,也不报错) - 方法调用:如
api?.fetch?.()(若fetch不存在或不是函数,返回undefined,不抛错)
配合 ?? 设置默认值
?. 只负责“不崩”,不负责“兜底”。需要 fallback 值时,用空值合并操作符 ?? 补上:
user?.avatar ?? '/default-avatar.png'config?.timeout ?? 5000
别用 || 替代 ??——如果属性值是 0、false 或空字符串,|| 会误判为假值而触发默认值,语义错误。
避开高频误用点
几个关键限制,写错会直接报语法错误或运行异常:
- 不能用于赋值:
obj?.a = 123是非法语法 - 不能独立使用:
?.prop或let x = ?.都不行 - 变量必须已声明:
user?.name前得有let user或类似声明,否则抛ReferenceError - 只保护对象本身,不保护 key 值:
obj?.[someKey]中,若someKey是undefined,实际变成obj?.[undefined],这不是可选链能拦截的
什么时候该用,什么时候不该用
可选链适合中间层级可能缺失的场景,比如解析 API 返回数据、读取用户未填字段、访问 localStorage 中可选键等。
但如果某个顶层对象按逻辑必须存在(比如 user 是登录后必有),而只是 address 可选,那就该写 user.address?.city,而不是 user?.address?.city——这样能让顶层意外为 undefined 的问题更快暴露出来。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











