2026-10-30 18:23:49
可选链操作符(?.)是 ECMAScript 2020(ES11) 引入的语法特性,用于安全访问对象的嵌套属性或调用方法。其核心目的是避免因访问 null 或 undefined 对象的属性而抛出 TypeError,从而简化代码中的冗余条件判断(如 if (obj && obj.prop))。
可选链操作符支持以下场景:
核心机制:短路评估当 ?. 左侧表达式为 null/undefined 时,整个表达式立即停止求值并返回 undefined;否则继续执行后续操作。
示例 1:属性访问
const user = { address: { city: "Anytown" } };const admin = {}; // 无 address 属性const guest = null;console.log(user?.address?.city); // "Anytown"console.log(admin?.address?.city); // undefinedconsole.log(guest?.address?.city); // undefined示例 2:方法调用
const calculator = { add: (a, b) => a + b };const logger = null;console.log(calculator.add?.(2, 3)); // 5console.log(logger?.log("Hello")); // undefined安全访问嵌套属性从 URL 查询参数中提取信息时,避免因 match 返回 null 而报错:
const search = "?name=Alice&type=user";const match = search.match(/type=(.*)/); // 可能为 nullconst type = match?.[1]; // 安全访问,若 match 为 null 则返回 undefinedconsole.log(type); // "user"简化条件判断替代多层嵌套的 if 语句:
// 传统写法if (obj && obj.prop && obj.prop.subProp) { /* ... */ }// 可选链写法if (obj?.prop?.subProp) { /* ... */ }非错误处理替代品若属性缺失表示逻辑错误(如必填字段),仍需使用 if 或 try...catch 显式处理。
// 错误示例:可选链掩盖了逻辑错误const config = null;const port = config?.port; // 返回 undefined,但可能期望抛出错误不适用于赋值左侧可选链不能用于赋值操作的左侧:
obj?.prop = 10; // 报错:Invalid left-hand side in assignment兼容性需现代浏览器或 Node.js(≥ 14),旧环境需通过 Babel 转译。
短路行为在链式调用中,若某一环节为 null/undefined,后续操作均不会执行:
obj?.prop.method(); // 若 obj 为 null,method() 不会被调用可选链操作符(?.)是 JavaScript 中简化属性访问和函数调用的重要工具,其优势包括:
合理使用场景:
避免滥用场景:
通过结合实际需求,可选链操作符能显著提升代码的简洁性与可靠性。