逻辑与 (&&)

对于一组布尔操作数,**逻辑与 (&&)** (逻辑合取) 运算符当且仅当所有操作数都为 true 时才为 true。否则它将为 false

更一般地,该运算符在从左到右评估时返回遇到的第一个假值操作数的值,或者如果所有操作数都是真值,则返回最后一个操作数的值。

试用

语法

js
x && y

描述

逻辑与 (&&) 从左到右评估操作数,立即返回遇到的第一个假值操作数的值;如果所有值都是真值,则返回最后一个操作数的值。

如果一个值可以转换为 true,则该值被称为真值。如果一个值可以转换为 false,则该值被称为假值

可以转换为 false 的表达式的示例

  • false;
  • null;
  • NaN;
  • 0;
  • 空字符串 (""''``);
  • 未定义.

与运算符保留非布尔值并按原样返回它们

js
result = "" && "foo"; // result is assigned "" (empty string)
result = 2 && 0; // result is assigned 0
result = "foo" && 4; // result is assigned 4

即使 && 运算符可以与非布尔操作数一起使用,它仍然被认为是布尔运算符,因为它的返回值总是可以转换为布尔基本类型。要显式地将它的返回值(或任何表达式)转换为相应的布尔值,请使用双非运算符Boolean 构造函数。

短路评估

逻辑与表达式是短路运算符。当每个操作数转换为布尔值时,如果发现一个转换的结果为 false,则与运算符停止并返回该假值操作数的原始值;它评估任何剩余的操作数。

考虑以下伪代码。

(some falsy expression) && expr

expr 部分永远不会被评估,因为第一个操作数 (some falsy expression) 被评估为假值。如果 expr 是一个函数,则该函数永远不会被调用。请参见下面的示例

js
function A() {
  console.log("called A");
  return false;
}
function B() {
  console.log("called B");
  return true;
}

console.log(A() && B());
// Logs "called A" to the console due to the call for function A,
// && evaluates to false (function A returns false), then false is logged to the console;
// the AND operator short-circuits here and ignores function B

运算符优先级

与运算符的优先级高于或运算符,这意味着 && 运算符在 || 运算符之前执行(请参见运算符优先级)。

js
true || false && false; // true
true && (false || false); // false
(2 === 3) || (4 < 0) && (1 === 1); // false

示例

使用与

以下代码显示了 && (逻辑与) 运算符的示例。

js
a1 = true && true; // t && t returns true
a2 = true && false; // t && f returns false
a3 = false && true; // f && t returns false
a4 = false && 3 === 4; // f && f returns false
a5 = "Cat" && "Dog"; // t && t returns "Dog"
a6 = false && "Cat"; // f && t returns false
a7 = "Cat" && false; // t && f returns false
a8 = "" && false; // f && f returns ""
a9 = false && ""; // f && f returns false

布尔值的转换规则

将与转换为或

以下涉及**布尔值**的操作

js
bCondition1 && bCondition2

总是等于

js
!(!bCondition1 || !bCondition2)

将或转换为与

以下涉及**布尔值**的操作

js
bCondition1 || bCondition2

总是等于

js
!(!bCondition1 && !bCondition2)

删除嵌套括号

由于逻辑表达式从左到右评估,因此只要遵循某些规则,就可以始终从复杂表达式中删除括号。

以下涉及**布尔值**的复合操作

js
bCondition1 || (bCondition2 && bCondition3)

总是等于

js
bCondition1 || bCondition2 && bCondition3

规范

规范
ECMAScript 语言规范
# prod-LogicalANDExpression

浏览器兼容性

BCD 表格仅在浏览器中加载

另请参阅