Logical Operators
Logical Operators
逻辑运算符通常用于Boolean
型(逻辑)值。这种情况,它们返回一个布尔型值。然而,&&
和||
运算符实际上返回一个指定操作数的值,因此这些运算符也用于非布尔型,它们返回一个非布尔型值。
描述
下面是逻辑运算符的说明:
Operator | Usage | Description |
---|---|---|
Logical AND (&&) | expr1 && expr2 | Returns expr1 if it can be converted to false; otherwise, returns expr2. Thus, when used with Boolean values, && returns true if both operands are true; otherwise, returns false. |
Logical OR (||) | expr1 || expr2 | Returns expr1 if it can be converted to true; otherwise, returns expr2. Thus, when used with Boolean values, || returns true if either operand is true. |
Logical NOT (!) | !expr | Returns false if its single operand can be converted to true; otherwise, returns true. |
下面是逻辑运算符的说明:
能够转换为false的表达式有:
null
;
NaN;
0
;
- 空字符串(
""
);
undefined
.
尽管 &&
和||
运算符能够使用非布尔值的操作数, 但它们依然被看作是布尔操作符,因为它们的返回值总是能够被转换为布尔值。
短路计算
由于逻辑表达式的运算的顺序是从左到右,也可以用以下规则进行"短路"计算:
false && (anything)
短路计算的结果为假。
true ||
(anything)
短路计算的结果为真。
逻辑规则保证这些评估总是正确的。请注意,上述表达式中的 anything 部分未被评估,因此这样做的任何副作用都不会生效。还要注意,上述表达式的 anything 部分是任何单个逻辑表达式(如圆括号所示)。
例如,下面示例代码中的两个函数是相等的。
function shortCircuitEvaluation() {
// logical OR (||)
doSomething() || doSomethingElse(
// logical AND (&&)
doSomething() && doSomethingElse(
}
function equivalentEvaluation() {
// logical OR (||)
var orFlag = doSomething(
if (!orFlag) {
doSomethingElse(
}
// logical AND (&&)
var andFlag = doSomething(
if (andFlag) {
doSomethingElse(
}
}
由于运算符优先级的存在,下面的表达式的结果却不相同。右侧被小括号括起来的操作变成了独立的表达式。
false && true || true // returns true
false && (true || true) // returns false
逻辑与(&&)
下面的代码是 && (逻辑与) 运算符的示例.
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
逻辑或(||)
下面的代码是 || (逻辑或) 运算符的示例.
o1 = true || true // t || t returns true
o2 = false || true // f || t returns true
o3 = true || false // t || f returns true
o4 = false || (3 == 4) // f || f returns false
o5 = 'Cat' || 'Dog' // t || t returns "Cat"
o6 = false || 'Cat' // f || t returns "Cat"
o7 = 'Cat' || false // t || f returns "Cat"
o8 = '' || false // f || f returns false
o9 = false || '' // f || f returns ""
逻辑非(!)
下面的代码是 !
(逻辑非) 运算符的示例.
n1 = !true // !t returns false
n2 = !false // !f returns true
n3 = !'Cat' // !t returns false
转换规则
将 AND 转换为 OR
以下涉及布尔运算:
bCondition1 && bCondition2
总是等于:
!(!bCondition1 || !bCondition2)
将 OR 转换为 AND
以下涉及布尔运算:
bCondition1 || bCondition2
总是等于:
!(!bCondition1 && !bCondition2)
在NOT之间转换
以下涉及布尔运算:
!!bCondition
总是等于:
bCondition
删除嵌套的括号
由于逻辑表达式是从左往右计算的,所以通常可以按照下面的规则删除小括号。
删除嵌套的 AND
以下涉及布尔运算:
bCondition1 || (bCondition2 && bCondition3)
总是等于:
bCondition1 || bCondition2 && bCondition3
删除嵌套的 OR
以下涉及布尔运算:
bCondition1 && (bCondition2 || bCondition3)
总是等于:
!(!bCondition1 || !bCondition2 && !bCondition3)
规范
Specification | Status | Comment |
---|---|---|
ECMAScript 1st Edition (ECMA-262) | Standard | Initial definition. |
ECMAScript 5.1 (ECMA-262) | Standard | Defined in several sections of the specification: Logical NOT Operator, Binary Logical Operators |
ECMAScript 2015 (6th Edition, ECMA-262) | Standard | Defined in several sections of the specification: Logical NOT Operator, Binary Logical Operators |
ECMAScript Latest Draft (ECMA-262) | Living Standard | Defined in several sections of the specification: Logical NOT Operator, Binary Logical Operators |
浏览器兼容性
Feature | Chrome | Edge | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|---|
Logical AND (&&) | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) |
Logical OR (||) | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) |
Logical NOT (!) | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) |
Feature | Android | Chrome for Android | Edge | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|---|
Logical AND (&&) | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) |
Logical OR (||) | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) |
Logical NOT (!) | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) |