非常教程

JavaScript参考手册

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)

JavaScript

JavaScript 是一种高级编程语言,通过解释执行,是一门动态类型,面向对象(基于原型)的解释型语言。它已经由ECMA(欧洲电脑制造商协会)通过 ECMAScript 实现语言的标准化。它被世界上的绝大多数网站所使用,也被世界主流浏览器( Chrome、IE、FireFox、Safari、Opera )支持。JavaScript 是一门基于原型、函数先行的语言,是一门多范式的语言,它支持面向对象编程,命令式编程,以及函数式编程。它提供语法来操控文本、数组、日期以及正则表达式等,不支持 I/O,比如网络