逻辑运算符(布尔运算符)用于将表达式转换为布尔值

运算符 语法 详解
逻辑与 ,AND(&&) 表达式1 && 表达式2 如果表达式1可以转换为 true,就返回表达式2;否则,返回表达式1
逻辑或,OR(||) 表达式1 || 表达式`2 如果表达式1可以转换为 true,则返回表达式1;  否则,返回表达式2
逻辑非,NOT(!) !表达式 如果表达式可以转换为 true,则返回 false;否则,返回 true

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

会被转换为 false 的表达式有null;NaN;0;空字符串(" " 或 ' ' 或 ` `);undfined

尽管 && 和 || 运算符能够使用非布尔值的操作符,但是仍然被看作是布尔操作符,因为它们的返回值总是能够被转换为布尔值。

如果要显式地将它们的返回值(或是表达式)转换为布尔值,可以使用 双重非运算符( !! )或者是 Boolean 函数

 

短路计算

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

1、为假的表达式 &&  expr    短路计算结果为 false

2、为真的表达式 || expr    短路计算结果为 true

短路意味着上述表达式中的 逻辑运算符后面的表达式不会被执行,因此后面的 expr 并不会生效。

整个表达式的值在第一个操作数被计算后就已经确定了。

短路与

逻辑与操作属于短路操作,即第一个操作数可以决定结果,那么就不会在对第二个操作数求值。

对于逻辑和操作而言,如果第一个操作数是 false,则无论第二个操作数是什么值,结果都不再可能是 true。

false && true           //直接返回  false

短路或

和短路与操作符相似,逻辑或操作符也是短路操作符。

第一个操作数的求值结果为 true,就不会对第二个操作数求值了。

true || false       //直接返回  true

 

逻辑非运算符  NOT

逻辑非运算符由一个叹号( ! )表示,可以用于ECMAScript 中的任何值。无论这个值是什么数据类型,这个操作符都会返回一个布尔值。

逻辑非操作符首先会将它的操作数转换为一个布尔值,然后再对其求反。

逻辑非操作符遵循下列规则:

  1、如果操作数是一个对象,返回 false

  2、如果操作数是一个空字符串,则返回 true

  3、如果操作数是非空字符串,返回 false

  4、如果操作数是数值 0,返回 true

  5、如果操作数是任意非0数值(包括 Infinity),返回 false

  6、如果操作数是 null,返回 true

  7、如果操作数是 NaN,返回 true

  8、如果操作数是 undefined,返回 true。

实例:

 !true              // !t 返回 false
 !false             // !f 返回 true
 !''                // !f 返回 true
 !'Cat'             // !t 返回 false
!0                  //返回 true
!Infinity            //返回false
!null                //返回 true
!NaN              //返回 true
!undefined       //返回 true

 

双重非运算符

双重非运算符是由两个叹号( !! )表示。

逻辑非运算符可以用于将一个值转换为与其相对应的布尔值,同时使用两个逻辑非操作符,实际上就会模拟 Boolean( ) 转型函数的行为。

其中,第一个逻辑非操作符会在无论什么操作数的情况下,都会返回一个布尔值。第二个逻辑非操作符对该布尔值求反,于是就得到了这个值真正对应的布尔值。

最终结果与使用函数 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

逻辑与操作符使用两个和号表示( && ),有两个操作数

逻辑与的真值表

第一个操作数                第二个操作数                          结果                          
true true true
true false false
false true false
false false false

逻辑与操作可以应用于任何类型的操作数,不仅仅是布尔值。

在有一个操作数不是布尔值的情况下,逻辑与操作就不一定返回布尔值;此时,它遵循下列规则:

  1、如果第一个操作数是对象,则返回第二个操作数;

  2、如果第二个操作数是对象,则只有在第一个操作数的求值结果为 true 的情况下才会返回该对象;

  3、如果两个操作数都是对象,则返回第二个操作数;

  4、如果第一个操作数是 null,则返回的是 null;

  5、如果第一个操作数是 NaN,则返回的是 NaN

  6、如果第一个操作数是 undefined,则返回 undefined。

实例:

 true  && true      // t && t 返回 true
 true  && false     // t && f 返回 false
 false && true      // f && t 返回 false
 false && (3 == 4)  // f && f 返回 false
 "aa" && "bb"     // t && t 返回 "bb"
 false && "aa"     // f && t 返回 false
 "Cat" && false     // t && f 返回 false
 ''    && false     // f && f 返回 ""
 false && ''        // f && f 返回 false
null && null       // 返回 null
NaN && NaN     // 返回 NaN
undefined && undefined       // 返回 undefined

 

逻辑或运算符  OR

逻辑或操作符由两个竖线符号( || )表示,有两个操作符。

逻辑或的真值表如下:

第一个操作                               第二个操作数                      结果                                  
true true true
true false true
false true true
false false false

和逻辑与操作类似,如果有一个操作数不是布尔值,逻辑或也不一定返回布尔值。

逻辑或运算遵循以下规则:

  1、如果第一个操作数是对象,则返回第一个操作数

  2、如果第一个操作数的求值结果为 false,则返回第二个操作数

  3、如果两个操作数都是对象,则返回第一个操作数;

  4、如果两个操作数都是 null,则返回 null;

  5、如果两个操作数都是 NaN,则返回 NaN;

  6、如果两个操作数都是 undefined,则返回 undefined;

实例:

true  || true      // t || t 返回 true
false || true      // f || t 返回 true
true  || false     // t || f 返回 true
false || (3 == 4)  // f || f 返回 false
"aa" || "bb"     // t || t 返回 "aa"
false || "aa"     // f || t 返回 "aa"
"Cat" || false     // t || f 返回 "Cat"
''  || false     // f || f 返回 false
false || ''        // f || f 返回 ""

undefined || undefined  
//返回 undefined
null || null
//返回 null
NaN || NaN
//返回 NaN

 

布尔值转换规则

1、将 AND 转换为 OR

aa && bb

等价于

!(!aa || !bb)

2、将 OR 转换为 AND

aa || bb

等价于

!(!aa && !bb)

3、逻辑运算符的优先级(运算符从左向右从大到小依次排列)

逻辑非!>  逻辑与&&  >  逻辑与 ||

console.log(false && true || true)
//返回 true
console.log(false && (true || true))
//返回 false

 

参考资料:

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Logical_Operators

《JavaScript高级程序设计》

posted on 2020-02-03 00:11  Cloud%  阅读(347)  评论(0编辑  收藏  举报