可选链操作符
在 {{ store.state.user?.loginUser?.userName ?? "未登录" }} 这段代码中,问号 ? 对应两种不同的现代 JavaScript/TypeScript 语法特性:
一、可选链操作符(Optional Chaining):?.
- 作用:安全访问嵌套对象属性,避免因中间属性为
null或undefined导致的报错[1]。 - 示例解释:
store.state.user?.loginUser?.userName- 等价于:
store.state.user && store.state.user.loginUser && store.state.user.loginUser.userName - 执行逻辑:
若store.state.user为null/undefined,直接返回undefined,不会继续访问loginUser;若loginUser不存在,同样停止后续访问。这能有效避免Cannot read property 'xxx' of undefined的错误[1]。
- 等价于:
二、空值合并运算符(Nullish Coalescing):??
- 作用:为左侧表达式提供默认值,仅当左侧为
null或undefined时,才返回右侧值[1]。 - 示例解释:
userName ?? "未登录"- 执行逻辑:
若userName为null/undefined,显示"未登录";否则直接显示userName。
(与||的区别:||会对所有假值如0、""、false生效,而??仅针对null/undefined)[1]
- 执行逻辑:
三、完整代码解析
<div>{{ store.state.user?.loginUser?.userName ?? "未登录" }}</div>
- 执行顺序:
- 通过
?.安全访问store.state.user.loginUser.userName - 若最终结果为
null/undefined,通过??显示默认值"未登录"
- 通过
四、对比传统写法
// 无可选链和空值合并的写法
const userName = store.state.user &&
store.state.user.loginUser &&
store.state.user.loginUser.userName;
<div>{{ userName || "未登录" }}</div>
- 缺点:
- 嵌套判断冗长
||会错误处理userName为""或0的情况
通过这两种语法,代码可读性和安全性都得到了显著提升[1]。