# 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