---
# System prepended metadata

title: JavaScript 中 ?? 和 || 的差别

---

# JavaScript 中 ?? 和 || 的差别

`??` 和 `||` 都是用于判断返回值的运算符，但它们有一些区别：

### 相同点

- 用法相同，都是前后是值，中间用符号连接。根据前面的值来判断最终返回前面的值还是后面的值。
- `值1 ?? 值2`
- `值1 || 值2`

### 不同点

判断方式不同：

使用 `??` 时，只有当 **值1** 为 `null` 或 `undefined` 时才返回 **值2**；[4]

使用 `||` 时，**值1** 会转换为布尔值判断，为 `true` 返回 **值1**，`false` 返回 **值2**[4]

```javascript
// ??
undefined ?? 2 // 2
null ?? 2 // 2 
0 ?? 2 // 0
"" ?? 2 // ""
true ?? 2 // true
false ?? 2 // false

// ||
undefined || 2 // 2
null || 2 // 2
0 || 2 // 2 
"" || 2 // 2
true || 2 // true
false || 2 // 2
```

总的来说，`??` 更加适合在不知道变量是否有值时使用。[4]

## C# 中 & 和 && 的差别

在 C# 中，`&` 和 `&&` 都表示与操作，区别是：

- `&&` 只要第一个条件不满足，后面条件就不再判断。
- `&` 要对所有的条件都进行判断。[3]

`&` 可以用作位运算符，当 `&` 两边的表达式不是 Boolean 类型的时候，`&` 表示按位操作。[3]

## C# 中 | 和 || 的差别  

在 C# 中，`|` 和 `||` 都表示或操作，区别是：

- `||` 只要第一个条件满足，后面条件就不再判断。
- `|` 要对所有的条件都进行判断。[3]

`|` 可以用作位运算符，当 `|` 两边的表达式不是 Boolean 类型的时候，`|` 表示按位操作。[3]

总之，`&&` 和 `||` 是短路运算符，只要能够确定结果就不再计算后面的条件。而 `&` 和 `|` 则会计算所有条件。

Citations:
[1] https://www.runoob.com/note/34429
[2] https://hackmd.io/%40wsp50317/rygXrgxoB
[3] https://www.cnblogs.com/renlinsen/p/14079571.html
[4] https://blog.csdn.net/weixin_41650390/article/details/113739845
[5] https://learn.microsoft.com/zh-tw/dotnet/csharp/language-reference/operators/boolean-logical-operators