# JavaScript/TypeScript 操作符区别: ?? vs || vs &&
# 概述
在 JavaScript 和 TypeScript 中, ?? 、 || 和 && 是三个常用的逻辑操作符,但它们有不同的用途和行为特点。
# 1. ?? (空值合并运算符)
# 特点
- ES2020 引入的新特性
- 仅在左侧为
null 或 undefined 时返回右侧值 - 不会将其他假值(如
0 、 '' 、 false )视为需要替换的值
# 语法
# 示例
| null ?? 'default' |
| undefined ?? 'default' |
| 0 ?? 'default' |
| '' ?? 'default' |
| false ?? 'default' |
| NaN ?? 'default' |
| |
| |
| const userAge = user.age ?? 18; |
# 2. || (逻辑或运算符)
# 特点
- 在左侧为任何假值时返回右侧值
- 假值包括:
null 、 undefined 、 0 、 '' 、 false 、 NaN - 传统的设置默认值方式
# 语法
# 示例
| null || 'default' |
| undefined || 'default' |
| 0 || 'default' |
| '' || 'default' |
| false || 'default' |
| NaN || 'default' |
| |
| |
| const userName = user.name || 'Anonymous'; |
# 3. && (逻辑与运算符)
# 特点
- 在左侧为真值时返回右侧值
- 在左侧为假值时返回左侧值(短路求值)
- 常用于条件渲染和短路求值
# 语法
# 示例
| true && 'show' |
| false && 'show' |
| null && 'show' |
| 'hello' && 'world' |
| 0 && 'show' |
| |
| |
| user.isLoggedIn && renderUserMenu() |
# 对比表格
| 操作符 | 左侧条件 | 返回值 | 用途 |
|---|
?? | null 或 undefined | 右侧值 | 处理空值,保留其他假值 |
|| | 任何假值 | 右侧值 | 传统默认值设置 |
&& | 真值 | 右侧值 | 条件执行、短路求值 |
# 实际应用场景
# 1. 设置默认值
| |
| const pageSize = config.pageSize ?? 10; |
| const timeout = options.timeout ?? 5000; |
| |
| |
| const message = user.message || 'No message'; |
| const className = props.className || 'default-class'; |
# 2. 条件渲染 (React/Vue)
| |
| {user && user.avatar && <img src={user.avatar} />} |
| {showModal && <Modal />} |
| |
| |
| user && user.preferences && user.preferences.theme && applyTheme(); |
# 3. 数据处理
| |
| const data = response.data ?? []; |
| const total = response.total ?? 0; |
| |
| |
| const isValid = form.isValid || false; |
| const errors = form.errors ?? {}; |
# 注意事项
# 1. 类型安全 (TypeScript)
| interface User { |
| name?: string; |
| age?: number; |
| } |
| |
| const user: User = {}; |
| const userName = user.name ?? 'Unknown'; |
| const userAge = user.age ?? 0; |
# 2. 避免常见错误
| |
| const count = getCount() || 1; |
| |
| |
| const count = getCount() ?? 1; |
# 3. 性能考虑
| |
| expensive() && doSomething(); |
| |
| |
| user && user.profile && user.profile.avatar && showAvatar(); |
# 总结
?? :专门处理 null/undefined ,是现代 JavaScript 的推荐做法|| :处理所有假值,适用于传统默认值设置&& :条件执行和短路求值,常用于条件渲染
选择哪个操作符取决于你的具体需求:是否需要保留 0 、空字符串等假值作为有效值。