逻辑与(&&)

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

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

尝试一下

const a = 3;
const b = -2;

console.log(a > 0 && b > 0);
// Expected output: 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® 2025 Language Specification
# prod-LogicalANDExpression

浏览器兼容性

Report problems with this compatibility data on GitHub
desktopmobileserver
Chrome
Edge
Firefox
Opera
Safari
Chrome Android
Firefox for Android
Opera Android
Safari on iOS
Samsung Internet
WebView Android
WebView on iOS
Deno
Node.js
Logical AND (&&)

Legend

Tip: you can click/tap on a cell for more information.

Full support
Full support

参见