逻辑运算符通常用于Boolean型(逻辑)值。这种情况,它们返回一个布尔型值。然而,&&||运算符实际上返回一个指定操作数的值,因此这些运算符也用于非布尔型,它们返回一个非布尔型值。

描述

下面是逻辑运算符的说明:

运算符 示例 说明
逻辑与 (&&) expr1 && expr2 如果expr1 能转换成false则返回expr1,否则返回expr2。因此,与布尔值一起使用时,如果两个操作数都为true&&返回true,否则返回false
逻辑或 (||) expr1 || expr2 如果expr1能转换成true则返回expr1,否则返回expr2。因此,与布尔值一起使用时,如果任意一个操作数为true||返回true
逻辑非(!) !expr

如果expr能转换为true,返回false

如果expr能转换为false,则返回true

如果一个值可以被转换为true,那么这个值就是所谓的truthy,如果可以被转换为false,那么这个值就是所谓的falsy

能够转换为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      // 结果为 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

以下涉及布尔运算:

bCondition1 && bCondition2
 

总是等于:

!(!bCondition1 || !bCondition2)
 

将 OR 转换为 AND

以下涉及布尔运算:

bCondition1 || bCondition2
 

总是等于:

!(!bCondition1 && !bCondition2)
 

删除嵌套的小括号

由于逻辑表达式是从左往右计算的,所以通常可以按照下面的规则删除小括号。

删除嵌套的 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) Draft Defined in several sections of the specification: Logical NOT Operator, Binary Logical Operators

浏览器兼容

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidEdge MobileFirefox for AndroidOpera for AndroidiOS SafariSamsung InternetNode.js
Logical AND (&&)Chrome Full support YesEdge Full support YesFirefox Full support 1IE Full support YesOpera Full support YesSafari Full support YesWebView Android Full support YesChrome Android Full support YesEdge Mobile Full support YesFirefox Android Full support 4Opera Android Full support YesSafari iOS Full support YesSamsung Internet Android Full support Yesnodejs Full support Yes
Logical OR (||)Chrome Full support YesEdge Full support YesFirefox Full support 1IE Full support YesOpera Full support YesSafari Full support YesWebView Android Full support YesChrome Android Full support YesEdge Mobile Full support YesFirefox Android Full support 4Opera Android Full support YesSafari iOS Full support YesSamsung Internet Android Full support Yesnodejs Full support Yes
Logical NOT (!)Chrome Full support YesEdge Full support YesFirefox Full support 1IE Full support YesOpera Full support YesSafari Full support YesWebView Android Full support YesChrome Android Full support YesEdge Mobile Full support YesFirefox Android Full support 4Opera Android Full support YesSafari iOS Full support YesSamsung Internet Android Full support Yesnodejs Full support Yes

Legend

Full support  
Full support

参考资料

文档标签和贡献者

此页面的贡献者: fphonor, zhangchen, YoungChen, zhuangyin, yenshen, teoli, MoltBoy
最后编辑者: fphonor,