可选链操作符(?.)是es2020引入的特性,用于安全访问深层嵌套对象属性、数组元素或方法调用,遇null/undefined即短路返回undefined;需搭配??提供默认值,不可用于赋值,且要求变量已声明。

ES6 并没有可选链操作符——它其实是 ES2020(ECMAScript 2020) 正式引入的特性。很多人误称为“ES6 可选链”,是因为习惯把所有现代 JS 新语法统称 ES6,但实际支持需环境为 Node.js 14+ 或主流浏览器(Chrome 80+、Firefox 74+、Safari 13.1+)。它的核心目标就一个:安全读取可能中途断裂的深层嵌套属性,不报错、不中断执行。
怎么用 ?. 安全读取深层属性
只要在任意访问操作前加 ?. ,整条链就会在遇到 null 或 undefined 时立刻返回 undefined,不再继续向下访问。
-
对象属性链:比如
user?.profile?.settings?.theme—— 若user是undefined,后面整段不执行,直接得undefined -
数组索引访问:如
list?.[0]?.name—— 即使list是空数组、null或未定义,也不报错 -
动态键名:如
obj?.[key]—— 注意key本身必须已声明且非null/undefined,否则变成obj?.[undefined],这不是可选链能拦截的 -
方法调用:如
api?.fetch?.()—— 先查api存在,再查fetch是函数,都满足才调用;任一环节缺失,返回undefined
为什么不能只靠 ?.,还得搭配 ??
?. 只负责“不断链”,不负责“给兜底值”。它返回的 undefined 在业务中往往不可用,所以通常要接空值合并操作符 ?? 提供默认值。
- 正确写法:
user?.avatar ?? '/default.png'、config?.timeout ?? 3000 - 别用
||替代:user?.count || 0在count是0时也会 fallback,语义错误;??只在左侧是null或undefined时生效
哪些坑必须避开
-
不能赋值:
obj?.name = 'Alice'是语法错误,?. 只用于读取 -
不能独立使用:
?.prop或let x = ?.都非法 -
变量必须已声明:没写
const user = {...}就直接用user?.name,会抛ReferenceError -
不保护 key 的有效性:如
obj?.[someKey]中,若someKey是undefined,实际访问的是obj?.[undefined],这仍可能触发意外行为
什么时候该用,什么时候该警惕
适合场景:解析 API 响应(字段可能缺失)、读取用户可选配置、处理 localStorage 中的松散结构数据。
要谨慎的场景:如果某个顶层对象按业务逻辑必须存在(例如登录后 currentUser 不应为 undefined),那就该写 currentUser.address?.city,而不是 currentUser?.address?.city——这样能让顶层意外为空的问题更快暴露,便于调试和定位根本原因。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











