From 310fd066e91f454b990372ffa30e803cc8120975 Mon Sep 17 00:00:00 2001 From: Florian Merz Date: Thu, 11 Feb 2021 12:56:40 +0100 Subject: unslug zh-cn: move --- .../operators/logical_operators/index.html | 238 --------------------- 1 file changed, 238 deletions(-) delete mode 100644 files/zh-cn/web/javascript/reference/operators/logical_operators/index.html (limited to 'files/zh-cn/web/javascript/reference/operators/logical_operators') diff --git a/files/zh-cn/web/javascript/reference/operators/logical_operators/index.html b/files/zh-cn/web/javascript/reference/operators/logical_operators/index.html deleted file mode 100644 index 5615e17d45..0000000000 --- a/files/zh-cn/web/javascript/reference/operators/logical_operators/index.html +++ /dev/null @@ -1,238 +0,0 @@ ---- -title: 逻辑运算符 -slug: Web/JavaScript/Reference/Operators/Logical_Operators -tags: - - JavaScript - - 操作符 - - 逻辑 -translation_of: Web/JavaScript/Reference/Operators -translation_of_original: Web/JavaScript/Reference/Operators/Logical_Operators ---- -
{{jsSidebar("Operators")}}
- -

逻辑运算符通常用于{{jsxref("Boolean","布尔")}}型(逻辑)值。这种情况下,它们返回一个布尔值。然而,&&|| 运算符会返回一个指定操作数的值,因此,这些运算符也用于非布尔值。这时,它们也就会返回一个非布尔型值。

- -
{{EmbedInteractiveExample("pages/js/expressions-logicaloperator.html")}}
- - - -

描述

- -

逻辑运算符如下表所示 (其中expr可能是任何一种类型, 不一定是布尔值):

- - - - - - - - - - - - - - - - - - - - - - - - -
运算符语法说明
逻辑与,AND(&&expr1 && expr2expr1 可转换为 true,则返回 expr2;否则,返回 expr1
逻辑或,OR(||expr1 || expr2expr1 可转换为 true,则返回 expr1;否则,返回 expr2
逻辑非,NOT(!!exprexpr 可转换为 true,则返回 false;否则,返回 true
- -

如果一个值可以被转换为 true,那么这个值就是所谓的 {{Glossary("truthy")}},如果可以被转换为 false,那么这个值就是所谓的 {{Glossary("falsy")}}。

- -

会被转换为 false 的表达式有:

- - - -

尽管 &&|| 运算符能够使用非布尔值的操作数, 但它们依然可以被看作是布尔操作符,因为它们的返回值总是能够被转换为布尔值。如果要显式地将它们的返回值(或者表达式)转换为布尔值,请使用双重非运算符(即!!)或者Boolean构造函数。

- -

短路计算

- -

由于逻辑表达式的运算顺序是从左到右,也可以用以下规则进行"短路"计算:

- - - -

短路意味着上述表达式中的expr部分不会被执行,因此expr的任何副作用都不会生效(举个例子,如果expr是一次函数调用,这次调用就不会发生)。造成这种现象的原因是,整个表达式的值在第一个操作数被计算后已经确定了。看一个例子:

- -
function A(){ console.log('called A'); return false; }
-function B(){ console.log('called B'); return true; }
-
-console.log( A() && B() );
-// logs "called A" due to the function call,
-// then logs false (which is the resulting value of the operator)
-
-console.log( B() || A() );
-// logs "called B" due to the function call,
-// then logs true (which is the resulting value of the operator)
-
- -

Operators precedence

- -

请注意,由于运算符优先级的存在,下面的表达式的结果却不相同。右侧被小括号括起来的操作变成了独立的表达式。

- -
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
-a8 = ''    && false     // f && f 返回 ""
-a9 = false && ''        // f && 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"
-o8 = ''    || false     // f || f 返回 false
-o9 = false || ''        // f || f 返回 ""
-
- -

逻辑非(!

- -

下面的代码是 ! (逻辑非) 运算符的示例.

- -
n1 = !true              // !t 返回 false
-n2 = !false             // !f 返回 true
-n3 = !''                // !f 返回 true
-n4 = !'Cat'             // !t 返回 false
-
- -

双重非(!!)运算符

- -

可能使用双重非运算符的一个场景,是显式地将任意值强制转换为其对应的布尔值。这种转换是基于被转换值的 "truthyness" 和 "falsyness"的(参见 {{Glossary("truthy")}} 和 {{Glossary("falsy")}})。

- -

同样的转换可以通过 Boolean 函数完成。

- -
n1 = !!true                   // !!truthy 返回 true
-n2 = !!{}                     // !!truthy 返回 true: 任何 对象都是 truthy 的…
-n3 = !!(new Boolean(false))   // …甚至 .valueOf() 返回 false 的布尔值对象也是!
-n4 = !!false                  // !!falsy 返回 false
-n5 = !!""                     // !!falsy 返回 false
-n6 = !!Boolean(false)         // !!falsy 返回 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)
- -

规范

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
规范状态备注
{{SpecName('ES1')}}{{Spec2('ES1')}}Initial definition.
{{SpecName('ES5.1', '#sec-11.11')}}{{Spec2('ES5.1')}}Defined in several sections of the specification: Logical NOT Operator, Binary Logical Operators
{{SpecName('ES6', '#sec-binary-logical-operators')}}{{Spec2('ES6')}}Defined in several sections of the specification: Logical NOT Operator, Binary Logical Operators
{{SpecName('ESDraft', '#sec-binary-logical-operators')}}{{Spec2('ESDraft')}}Defined in several sections of the specification: Logical NOT Operator, Binary Logical Operators
- -

浏览器兼容性

- - - -

{{Compat("javascript.operators.logical")}}

- -

参见

- - -- cgit v1.2.3-54-g00ecf