逻辑或 (||)
逻辑或 (||)(逻辑析取)运算符对于一组操作数而言,当且仅当其一个或多个操作数为真时,其结果为真。它通常与布尔(逻辑)值一起使用。在这种情况下,它会返回一个布尔值。然而,|| 运算符实际上会返回其中一个指定操作数的值,因此,如果此运算符与非布尔值一起使用,它将返回一个非布尔值。
试一试
const a = 3;
const b = -2;
console.log(a > 0 || b > 0);
// Expected output: true
语法
js
x || y
描述
如果 x 可以转换为 true,则返回 x;否则,返回 y。
如果一个值可以转换为 true,则该值被称为真值 (truthy)。如果一个值可以转换为 false,则该值被称为假值 (falsy)。
可以转换为 false 的表达式示例有:
null;NaN;0;- 空字符串(
""或''或``); undefined.
尽管 || 运算符可以与非布尔值操作数一起使用,但它仍然可以被认为是布尔运算符,因为其返回值总是可以转换为布尔原始值。要将其返回值(或通常的任何表达式)显式转换为相应的布尔值,请使用双非运算符或Boolean() 构造函数。
短路求值
逻辑或表达式从左到右进行评估,它使用以下规则进行可能的“短路”评估:
(某个真值表达式) || expr 会短路评估为该真值表达式。
短路意味着上述 expr 部分**不进行评估**,因此任何这样做的副作用都不会生效(例如,如果 expr 是一个函数调用,则该调用永远不会发生)。发生这种情况是因为在评估第一个操作数后,运算符的值已经确定。请参阅示例:
js
function A() {
console.log("called A");
return false;
}
function B() {
console.log("called B");
return true;
}
console.log(B() || A());
// Logs "called B" due to the function call,
// then logs true (which is the resulting value of the operator)
运算符优先级
以下表达式可能看起来等效,但它们不是,因为 && 运算符在 || 运算符之前执行(请参阅运算符优先级)。
js
true || false && false; // returns true, because && is executed first
(true || false) && false; // returns false, because grouping has the highest precedence
示例
使用 OR
以下代码展示了 ||(逻辑或)运算符的示例。
js
true || true; // t || t returns true
false || true; // f || t returns true
true || false; // t || f returns true
false || 3 === 4; // f || f returns false
"Cat" || "Dog"; // t || t returns "Cat"
false || "Cat"; // f || t returns "Cat"
"Cat" || false; // t || f returns "Cat"
"" || false; // f || f returns false
false || ""; // f || f returns ""
false || varObject; // f || object returns varObject
布尔值的转换规则
将 AND 转换为 OR
以下涉及布尔值的操作
js
bCondition1 && bCondition2
始终等于
js
!(!bCondition1 || !bCondition2)
将 OR 转换为 AND
以下涉及布尔值的操作
js
bCondition1 || bCondition2
始终等于
js
!(!bCondition1 && !bCondition2)
移除嵌套括号
由于逻辑表达式从左到右进行评估,因此总是可以根据某些规则从复杂表达式中移除括号。
以下涉及布尔值的复合操作
js
bCondition1 && (bCondition2 || bCondition3)
始终等于
js
!(!bCondition1 || !bCondition2 && !bCondition3)
规范
| 规范 |
|---|
| ECMAScript® 2026 语言规范 # prod-LogicalORExpression |
浏览器兼容性
加载中…