逻辑或(||)
- 从左到右进行运算,除非右边的运算符优先级高于
||
- 属于布尔逻辑运算符,左侧的操作数会被强制转换为布尔值,任何的假值(0,'',NaN,false等)都会被视为false
0||''||NaN||false||true都只会返回true值
控制合并运算符(??)
- 从左到右运算
- 属于逻辑运算符,只有当左侧为null或者undefined的时候才会返回右侧,因此
0??123
''??123
NaN??123
false??123
true??123
null??123
undefined??123
- 因此,可以将控制合并运算符(
??)当作逻辑运算符(||)的一个特列
- 在需要将
0||''||NaN||false 作为有效返回值的时候不能用||而应该使用??
注意
- 不能将
?? 直接与逻辑与(&&)和逻辑或(||)运算符组合使用,如:
null || undefined ?? "foo";
true && undefined ?? "foo";
- 假如需要将
??直接与||或者&&组合使用则需要添加括号()来表示优先级:
(null || undefined) ?? "foo";
(false && undefined) ?? "foo";
- 使用
??需要考虑浏览器的兼容性

参考