逻辑与(&&)

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.

当且仅当所有操作数为 true 时,一组布尔操作数的逻辑与&&,逻辑连接)运算结果为 true,否则为 false

一般来说,当从左到右求值时,该操作符返回第一个假值操作数的值;如果它们都是真值,则返回最后一个操作数的值。

尝试一下

语法

js
expr1 && expr2

描述

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

能够转化为 true 的值叫做真值,能够转化为 false 的值叫做假值

能够转化为 false 的表达式的示例如下:

  • false
  • null
  • NaN
  • 0
  • 空字符串(""''``);
  • undefined

与运算符会保留所有非布尔值,并原样返回它们:

js
result = "" && "foo"; // 结果被赋值为 ""(空字符串)
result = 2 && 0; // 结果被赋值为 0
result = "foo" && 4; // 结果被赋值为 4

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

短路求值

逻辑与是一种短路运算符。当每个操作数被转换为布尔值时,如果发现一个转换的结果是 false,那么逻辑与运算符就会停止,并返回该假操作数的原始值;它不会对任何其余的操作数求值。

考虑如下伪代码。

(some falsy expression) && expr

expr 部分永远不会被求值,因为第一个操作数 (some falsy expression) 被求值为假值。如果 expr 是一个函数,它将不会被调用。查看如下示例:

js
function A() {
  console.log("调用了 A");
  return false;
}
function B() {
  console.log("调用了 B");
  return true;
}
console.log(A() && B());
// 由于调用了 A 函数,故会输出“调用了 A”到控制台,
// && 求值结果为 false(A 函数返回 false),然后输出 false 到控制台;
// 与运算符在这里短路,忽略了 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

规范

Specification
ECMAScript Language Specification
# prod-LogicalANDExpression

浏览器兼容性

BCD tables only load in the browser

参见