摘要
逻辑运算符通常用于布尔型(逻辑)值;这种情况,它们返回一个布尔型值。然而,&&和||运算符实际上返回一个指定操作数的值,因此这些运算符也用于非布尔型,它们返回一个非布尔型值。
描述
下面是逻辑运算符的说明:
运算符 | 示例 | 说明 |
---|---|---|
逻辑与 (&& ) |
expr1 && expr2 |
如果expr1 能转换成false则返回expr1,否则返回expr2. 因此, 在Boolean环境中使用时, 两个操作结果都为true时返回true,否则返回false. |
逻辑或 (|| ) |
expr1 || expr2 |
如果expr1能转换成true则返回expr1,否则返回expr2. 因此,在boolean环境(在if的条件判断中)中使用时, 二者操作结果中只要有一个为true,返回true;二者操作结果都为false时返回false. |
逻辑非(! ) |
!expr |
如果单个表达式能转换为true的话返回false,否则返回true. |
如果一个值可以被转换为true,那么这个值就是所谓的truthy,如果可以被转换为false,那么这个值就是所谓的falsy。
能够转换为false的表达式有:
- null;
- NaN;
- 0;
- 空字符串("");
- undefined.
尽管 &&
和 ||
运算符能够使用非Boolean值的操作数, 但它们依然被看作是Boolean操作符,因为它们的返回值总是能够被转换为Boolean值。
短路计算
由于逻辑表达式的运算的顺序是从左到右,也可以用以下规则进行"短路"计算:
false && (anything)
短路计算的结果为false.true || (anything)
短路计算的结果为 true.
该规则确保这些计算的准确性. 注意如果上述表达式中的 anything 部分不能被计算的话, 两边都不会生效.还需要注意的是,上述表达式中的 anything 部分是任意的单个逻辑表达式(小括号中).
下面示例代码中的两个函数是相等的.
function shortCircuitEvaluation() { doSomething() || doSomethingElse() } function equivalentEvaluation() { var flag = doSomething(); if (!flag) { doSomethingElse(); } }
但,由于运算符优先级的存在,下面的表达式的结果却不相同.右侧被小括号括起来的操作变成了独立的表达式.
false && true || true // 结果为 true
false && (true || true) // 结果为 false
逻辑与 (&&)
下面的代码是 && (逻辑与) 运算符的示例.
a1=true && true // t && t 结果为 true a2=true && false // t && f 结果为 false a3=false && true // f && t 结果为 false a4=false && (3 == 4) // f && f 结果为 false a5="Cat" && "Dog" // t && t 结果为 Dog a6=false && "Cat" // f && t 结果为 false a7="Cat" && false // t && f 结果为 false
逻辑或 (||)
下面的代码是 || (逻辑或) 运算符的示例.
o1=true || true // t || t 结果为 true o2=false || true // f || t 结果为 true o3=true || false // t || f 结果为 true o4=false || (3 == 4) // f || f 结果为 false o5="Cat" || "Dog" // t || t 结果为 Cat o6=false || "Cat" // f || t 结果为 Cat o7="Cat" || false // t || f 结果为 Cat
逻辑非 (!)
下面的代码是 !
(逻辑非) 运算符的示例.
n1=!true // !t 结果为 false n2=!false // !f 结果为 true n3=!"Cat" // !t 结果为 false
转换规则
将 AND 转换为 OR
下面涉及到Boolean运算的混合的操作:
bCondition1 && bCondition2
与下面的相等:
!(!bCondition1 || !bCondition2)
将 OR 转换为 AND
下面涉及到Boolean运算的混合的操作:
bCondition1 || bCondition2
与下面的相等:
!(!bCondition1 && !bCondition2)
删除嵌套的小括号
由于逻辑表达式是从左往右计算的,所以通常可以按照下面的规则删除小括号.
删除嵌套的 AND
下面涉及到Boolean运算的混合的操作:
bCondition1 || (bCondition2 && bCondition3)
与下面的相等:
bCondition1 || bCondition2 && bCondition3
删除嵌套的 OR
下面涉及到Boolean运算的混合的操作:
bCondition1 && (bCondition2 || bCondition3)
与下面的相等:
!(!bCondition1 || !bCondition2 && !bCondition3)
规范
规范 | 状态 | 说明 |
---|---|---|
ECMAScript 1st Edition. | Standard | Initial definition. |
ECMAScript 5.1 (ECMA-262) Logical NOT Operator ECMAScript 5.1 (ECMA-262) Binary Logical Operators |
Standard | |
ECMAScript 2015 (6th Edition, ECMA-262) Logical NOT operator ECMAScript 2015 (6th Edition, ECMA-262) Binary Logical Operators |
Standard |
浏览器兼容性
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
逻辑与 (&& ) |
(Yes) | (Yes) | (Yes) | (Yes) | (Yes) |
逻辑或 (|| ) |
(Yes) | (Yes) | (Yes) | (Yes) | (Yes) |
逻辑非 (! ) |
(Yes) | (Yes) | (Yes) | (Yes) | (Yes) |
Feature | Android | Chrome for Android | Firefox (Gecko) | IE | Opera | Safari |
---|---|---|---|---|---|---|
逻辑与 (&& ) |
(Yes) | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) |
逻辑或 (|| ) |
(Yes) | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) |
逻辑非 (! ) |
(Yes) | (Yes) | (Yes) | (Yes) |
向后兼容: 在 JavaScript 1.0 和 1.1 中的表现
&& 和|| 表达式的行为如下:
运算符 | 示例 | 说明 |
---|---|---|
&& |
expr1 && expr2 |
如果第一个表达式(expr1) 能转换成false, 那么&& 运算会返回false,而不是expr1的值. |
|| |
expr1 || expr2 |
如果第一个表达式(expr1) 能转换成true, 那么|| 运算会返回true,而不是expr1的值. |