逻辑或(||)
对于一组操作数的逻辑或(||
,逻辑析取)运算符,当且仅当其一个或多个操作数为真,其运算结果为真。它通常与布尔(逻辑)值一起使用。当它是布尔值时,返回一个布尔值。然而,||
运算符实际上是返回一个指定的操作数的值,所以如果这个运算符被用于非布尔值,它将返回一个非布尔值。
尝试一下
语法
js
expr1 || expr2
描述
短路求值
逻辑或从左到右进行求值,它使用如下规则进行“短路”测试:
(some truthy expression) || expr
被短路评估为真值。
短路意味着上面的 expr
部分不被求值,因此不会发生任何副作用(例如,如果 expr
是一个函数调用,调用就不会发生)。这是因为在对第一个操作数进行评估后,操作数的值已经确定。参见下述示例:
js
function A() {
console.log("调用了 A");
return false;
}
function B() {
console.log("调用了 B");
return true;
}
console.log(B() || A());
// 由于调用了 B 函数,故会输出 "called B" 到控制台,
// 然后输出 true(运算符的运算结果)
运算符优先级
以下表达式看起来等价,但实际上不是,因为 &&
运算符比 ||
运算符先执行(参见运算符优先级)。
js
true || false && false; // 返回 true,因为 && 先执行
(true || false) && false; // 返回 false,因为分组运算符优先级更高
示例
使用或运算符
下列代码展示了 ||
(逻辑或)运算符的用法。
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
布尔值转化规则
与运算符转化为或运算符
下述涉及到布尔运算符的运算:
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-LogicalORExpression |
浏览器兼容性
BCD tables only load in the browser