逻辑运算符通常用于布尔型(逻辑)值。这种情况下,它们返回一个布尔值。它经常和关系运算符一起配合使用。“&&” 、“!”和“ ||” 运算符会返回一个指定操作数的值,因此,这些运算符也用于非布尔值。这时,它们也就会返回一个非布尔型值。

  逻辑与(&&)

    逻辑与是由两个和号(&)表示,有两个操作位数,只有当左右两边都时成立,整个条件才成立.否则就是不成立。它属于一个短路操作,如果第一个条件就可决定结果,那就不用操作第二个条件了。它可以和多个运算符连用,返回第一个布尔值为false的表达式。可以取代if结构,也可以用于回调函数中。

    <script>
        var i = 1;
        var n = 1;
        var result1 = (true && i++);//第一个条件成立,操作第二个条件
        var resutl2 = (false && ++n);//第一个条件不成立,直接退出
        console.log(i,n);  //2 1 
    </script>
    <script>
        //左侧为真,返回右侧的值,左侧为假,返回左侧的值 false,undefined,null,0,NaN,
'' 这些为假其余为真;可以多个连用,返回第一个布尔值为false的表达式的值
console.log('string' && ''); //'' console.log('string' && 1 + 2);//3 console.log('' && undefined);//'' console.log(false && null);//false console.log(0 && 'string');//0 console.log(NaN && false);//NaN console.log(true && 'string' && undefined && '' && 2); //undefined       </script>
    <script>
        if (a == b) {
           dosomething();
        }//等价于
       a == b && dosomething();

       function fn(a){
           if(a){
              a();
           }
       }//等价于
       function fn(a){
           a && a();
       }
    </script>

  逻辑或(||)

    有两个操作数,只有两个都条件都不成立时,结果才是不成立,否则都是成立的。它也是一种短路操作。也可多个连用,返回第一个布尔值为true的表达式的值,常用于为变量设置默认值。左侧为真,返回左侧的值,左侧为假,返回右侧的值。

<script>
        //左侧为真,返回左侧的值,左侧为假,返回右侧的值
        console.log('string' || '');//string
        console.log('string' || 'number');//string
        console.log(undefined || 2);//2
        console.log(NaN || false);//false

        console.log('' || undefined || false || 3 || string); //3

        var n = 1;
        var m = 1;
        var result = (true || ++n);//true为真,不执行后面的操作
        var result = (false || --m);//false为假,执行行后面操作
        console.log( n,m);  //1 0

        //如果没有向参数a中传入值,则将参数设置为空对象
        function fn(a){
            a=a || {};
        }
 </script>

  逻辑非(!)

    逻辑非是一个叹号,无论这个值是什么数据类型,使用这个操作符后都会返回一个布尔值。逻辑非操作符会先将它的操作数转换成一个布尔值然后再对其求反。如果同时用两个逻辑非的话那就相当于调用Boolean()方法,负负得正。一般用于控制循环。

    <script>
        console.log(!!NaN); //false
        console.log(!![]);  //true
        console.log(
            !! new Boolean(false)); //true
    </script>
12-30 02:59