07逻辑运算符
JavaScript 中有四个逻辑运算符:||(或),&&(与),!(非),??(空值合并运算符)。
||(或)
逻辑或能够操作布尔值。如果参与运算的任意一个参数为 true,返回的结果就为 true,否则返回 false。
除此之外,或运算还可以寻找第一个真值,给定多个参与或运算的值:
1 | result = value1 || value2 || value3; |
或运算符 || 做了如下的事情:
- 从左到右依次计算操作数。
- 处理每一个操作数时,都将其转化为布尔值。如果结果是
true,就停止计算,返回这个操作数的初始值。 - 如果所有的操作数都被计算过(也就是,转换结果都是
false),则返回最后一个操作数。
返回的值是操作数的初始形式,不会做布尔转换。
或运算符 || 的另一个用途是所谓的“短路求值”。
在下面这个例子中,只会打印第二条信息:
1 | true || alert("not printed"); |
在第一行中,或运算符 || 在遇到 true 时立即停止运算,所以 alert 没有运行。
利用这个特性,可以使只在左侧的条件为假时才执行命令。
&&(与)
1 | result = a && b; |
当两个操作数都是真值时,与运算返回 true,否则返回 false。
与运算可以用来寻找第一个假值,给出多个参加与运算的值:
1 | result = value1 && value2 && value3; |
与运算 && 做了如下的事:
- 从左到右依次计算操作数。
- 在处理每一个操作数时,都将其转化为布尔值。如果结果是
false,就停止计算,并返回这个操作数的初始值。 - 如果所有的操作数都被计算过(例如都是真值),则返回最后一个操作数。
换句话说,与运算返回第一个假值,如果没有假值就返回最后一个值。
1 | // 如果第一个操作数是真值, |
我们也可以在一行代码上串联多个值。查看第一个假值是如何被返回的:
1 | alert( 1 && 2 && null && 3 ); // null |
如果所有的值都是真值,最后一个值将会被返回:
1 | alert( 1 && 2 && 3 ); // 3,最后一个值 |
!(非)
逻辑非运算符接受一个参数,并按如下运作:
- 将操作数转化为布尔类型:
true/false。 - 返回相反的值。
1 | alert( !true ); // false |
两个非运算 !! 有时候用来将某个值转化为布尔类型:
1 | alert( !!"non-empty string" ); // true |
也就是,第一个非运算将该值转化为布尔类型并取反,第二个非运算再次取反。最后我们就得到了一个任意值到布尔值的转化。
有一个略显冗长的方式也可以实现同样的效果 —— 一个内建的 Boolean 函数:
1 | alert( Boolean("non-empty string") ); // true |
空值合并运算符 ‘??’
a ?? b 的结果是:
- 如果
a既不是null也不是undefined,则结果为a, - 如果
a是null或者undefined,则结果为b。
?? 的常见使用场景是提供默认值。
例如,在这里,如果 user 的值不为 null/undefined 则显示 user,否则显示 匿名:
1 | let user; |
在下面这个例子中,我们将一个名字赋值给了 user:
1 | let user = "John"; |
我们还可以使用 ?? 序列从一系列的值中选择出第一个非 null/undefined 的值。
1 | let firstName = null; |
??运算符的优先级非常低,仅略高于?和=,因此在表达式中使用它时请考虑添加括号。- 如果没有明确添加括号,不能将其与
||或&&一起使用。

