• JavaScript 逻辑运算符


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

    运算符 语法 详解
    逻辑与 ,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高级程序设计》

  • 相关阅读:
    前端开发中一些好用的软件包。
    LeetCode 26 删除排序数组中的重复项
    算法 主定理
    算法学习计划继续三四个月
    Web Api
    DOM viewport
    CSS OM
    DOM Range Api
    DOM 操作 2
    DOM Event
  • 原文地址:https://www.cnblogs.com/nyw1983/p/12238991.html
Copyright © 2020-2023  润新知