可选链操作符(?.)适用于访问深层嵌套属性、调用可能不存在的方法、访问数组元素,需与??搭配设默认值;不支持赋值、delete、new及私有字段;es2020特性,可用babel降级。

JavaScript 中的可选链操作符(?.)能安全访问嵌套对象属性,避免因 null 或 undefined 报错。
可选链适用于哪些场景
当你不确定某个对象是否存在,或某层属性是否为 null/undefined 时,用 ?. 替代传统点号访问可防止运行时错误。
- 访问深层嵌套对象的属性,如
user?.profile?.address?.city - 调用可能不存在的方法,如
obj?.method?.() - 访问数组元素时结合可选链与括号表示法,如
arr?.[0]?.name
可选链与逻辑运算符配合使用
?. 本身不会提供默认值,常和空值合并操作符 ?? 搭配来设定 fallback:
错误写法:user?.name || 'Anonymous' —— 若 name 是空字符串或 0,也会被误判为假值
推荐写法:user?.name ?? 'Anonymous' —— 只有 name 为 null 或 undefined 才启用默认值
注意可选链的限制
可选链只在左侧值为 null 或 undefined 时短路返回 undefined,其他情况照常执行:
- 不能用于赋值:❌
obj?.prop = value会报语法错误 - 不能用于 delete:❌
delete obj?.prop不合法 - 不能用于构造函数:❌
new obj?.Constructor()不支持 - 静态属性或私有字段暂不支持(如
Class?.#privateField无效)
兼容性与替代方案
可选链是 ES2020 特性,现代浏览器和 Node.js 14+ 均支持。若需兼容旧环境:
- 用 Babel 编译(插件
@babel/plugin-proposal-optional-chaining) - 手动降级:用逻辑判断或 Lodash 的
get(obj, 'path', defaultValue) - TypeScript 用户注意:类型推导会将结果视为联合类型,如
string | undefined,必要时加非空断言!或类型守卫
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











