07逻辑运算符

JavaScript 中有四个逻辑运算符:||(或),&&(与),!(非),??(空值合并运算符)。

||(或)

逻辑或能够操作布尔值。如果参与运算的任意一个参数为 true,返回的结果就为 true,否则返回 false

除此之外,或运算还可以寻找第一个真值,给定多个参与或运算的值:

1
result = value1 || value2 || value3;

或运算符 || 做了如下的事情:

  • 从左到右依次计算操作数。
  • 处理每一个操作数时,都将其转化为布尔值。如果结果是 true,就停止计算,返回这个操作数的初始值。
  • 如果所有的操作数都被计算过(也就是,转换结果都是 false),则返回最后一个操作数。

返回的值是操作数的初始形式,不会做布尔转换。

或运算符 || 的另一个用途是所谓的“短路求值”。

在下面这个例子中,只会打印第二条信息:

1
2
true || alert("not printed");
false || alert("printed");

在第一行中,或运算符 || 在遇到 true 时立即停止运算,所以 alert 没有运行。

利用这个特性,可以使只在左侧的条件为假时才执行命令。

&&(与)

1
result = a && b;

当两个操作数都是真值时,与运算返回 true,否则返回 false

与运算可以用来寻找第一个假值,给出多个参加与运算的值:

1
result = value1 && value2 && value3;

与运算 && 做了如下的事:

  • 从左到右依次计算操作数。
  • 在处理每一个操作数时,都将其转化为布尔值。如果结果是 false,就停止计算,并返回这个操作数的初始值。
  • 如果所有的操作数都被计算过(例如都是真值),则返回最后一个操作数。

换句话说,与运算返回第一个假值,如果没有假值就返回最后一个值。

1
2
3
4
5
6
7
8
9
// 如果第一个操作数是真值,
// 与运算返回第二个操作数:
alert( 1 && 0 ); // 0
alert( 1 && 5 ); // 5

// 如果第一个操作数是假值,
// 与运算将直接返回它。第二个操作数会被忽略
alert( null && 5 ); // null
alert( 0 && "no matter what" ); // 0

我们也可以在一行代码上串联多个值。查看第一个假值是如何被返回的:

1
alert( 1 && 2 && null && 3 ); // null

如果所有的值都是真值,最后一个值将会被返回:

1
alert( 1 && 2 && 3 ); // 3,最后一个值

!(非)

逻辑非运算符接受一个参数,并按如下运作:

  1. 将操作数转化为布尔类型:true/false
  2. 返回相反的值。
1
2
alert( !true ); // false
alert( !0 ); // true

两个非运算 !! 有时候用来将某个值转化为布尔类型:

1
2
alert( !!"non-empty string" ); // true
alert( !!null ); // false

也就是,第一个非运算将该值转化为布尔类型并取反,第二个非运算再次取反。最后我们就得到了一个任意值到布尔值的转化。

有一个略显冗长的方式也可以实现同样的效果 —— 一个内建的 Boolean 函数:

1
2
alert( Boolean("non-empty string") ); // true
alert( Boolean(null) ); // false

空值合并运算符 ‘??’

a ?? b 的结果是:

  • 如果 a 既不是 null 也不是 undefined,则结果为 a
  • 如果 a 是null 或者 undefined,则结果为 b

?? 的常见使用场景是提供默认值。

例如,在这里,如果 user 的值不为 null/undefined 则显示 user,否则显示 匿名

1
2
3
let user;

alert(user ?? "匿名"); // 匿名(user 未定义)

在下面这个例子中,我们将一个名字赋值给了 user

1
2
3
let user = "John";

alert(user ?? "匿名"); // John(user 已定义)

我们还可以使用 ?? 序列从一系列的值中选择出第一个非 null/undefined 的值。

1
2
3
4
5
6
let firstName = null;
let lastName = null;
let nickName = "Supercoder";

// 显示第一个已定义的值:
alert(firstName ?? lastName ?? nickName ?? "匿名"); // Supercoder
  • ?? 运算符的优先级非常低,仅略高于 ? 和 =,因此在表达式中使用它时请考虑添加括号。
  • 如果没有明确添加括号,不能将其与 || 或 && 一起使用。
Author

WaterNorth

Posted on

2025-08-22

Updated on

2025-08-22

Licensed under