逻辑与 (&&)
对于一组布尔操作数,**逻辑与 (&&
)** (逻辑合取) 运算符当且仅当所有操作数都为 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 表格仅在浏览器中加载