JavaScript中的逻辑与、逻辑或操作符总结

 最近在学习JavaScript的过程中,发现逻辑与、逻辑或这两个操作符同C语言中的不太一样。当操作数不全是布尔值的时候,逻辑运算结果不一定是布尔值,有可能是某一个操作数。而且存在多种情况,记忆起来比较麻烦。

看看《JavaScript高级程序设计》(第3版)这本书中对这块知识点是怎样总结的:

逻辑与操作可以应用任何类型的操作数,而不仅仅是布尔值。在有一个操作数不是布尔值的情况下,逻辑与操作就不一定返回布尔值。
1、如果第一个操作数是对象,则返回第二个操作数;
2、如果第二个操作数是对象,则只有在第一个操作数的求值结果为true的情况下才会返回该对象;
3、如果两个操作数都是对象,则返回第二个操作数;
4、如果第一个操作数是null,则返回null;
5、如果第一个操作数是NaN,则返回NaN;
6、如果第一个操作数是undefined,则返回undefined。

逻辑或操作和逻辑与操作相似,如果有一个操作数不是布尔值,逻辑或也不一定返回布尔值。
1、如果第一个操作数是对象,则返回第一个操作数;
2、如果第一个操作数的求值结果为false,则返回第二个操作数;
3、如果两个操作数都是对象,则返回第一个操作数;
4、如果两个操作数都是null,则返回null;
5、如果两个操作数都是NaN,则返回NaN;
6、如果两个操作数都是undefined,则返回undefined。

(注:上面规则中提到的“对象”并不就是指的object类型,可以通过下面的例子得到验证。)

 

我打算亲自验证一下书中的结论,先来看逻辑与操作符的例子(通过console.log()打印出了运算结果,在注释中给出):

            console.log(1 && 3);    //3
            console.log(0 && 3);    //0
            console.log('str1' && 'str2'); //str2
            console.log('str1' && ''); //空字符串,也就是打印结果里什么都没有
            console.log('str1' && 0); //0
            console.log('' && 'str2'); //空字符串,也就是打印结果里什么都没有
            console.log('' && 0); //空字符串,也就是打印结果里什么都没有
            console.log(0 && ''); //0
            console.log(NaN && 'str'); //NaN
            console.log(undefined && ''); //undefined
            console.log(undefined && 1); //undefined
            console.log(false && 1);    //false
            console.log(false && 0);    //false

 

好,我们再来看逻辑或操作符的例子(通过console.log()打印出了运算结果,在注释中给出):

            console.log(1 || 3);    //1
            console.log(0 || 3);    //3
            console.log('str1' || 'str2'); //str1
            console.log('str1' || ''); //str1
            console.log('str1' || 0); //str1
            console.log('' || 'str2'); //str2
            console.log('' || 0); //0
            console.log(0 || ''); //空字符串,也就是打印结果里什么都没有
            console.log(NaN || 'str'); //str
            console.log(undefined || ''); //空字符串,也就是打印结果里什么都没有
            console.log(undefined || 1); //1
            console.log(false || 1);    //1
            console.log(true || undefined);    //true

 

 

通过上面的例子(没有列举操作数为对象或函数的情况,其实规律一样),我们稍微总结一下,就可以得到下面的结论:

逻辑与操作符:

1、如果第一个操作数不是直接给出的布尔值true,而是能够通过转换布尔值得到true,那么返回值就是第二个操作数。
2、如果第一个操作数不是直接给出的布尔值false,而是能够通过转换布尔值得到false,那么返回值就是第一个操作数。
3、如果第一个操作数是直接给出的布尔值false,那么返回值就是false。

 

逻辑或操作符:

1、如果第一个操作数不是直接给出的布尔值true,而是能够通过转换布尔值得到true,那么返回值就是第一个操作数。
2、如果第一个操作数不是直接给出的布尔值false,而是能够通过转换布尔值得到false,那么返回值就是第二个操作数。
3、如果第一个操作数是直接给出的布尔值ture,那么返回值就是true。

 

这样是不是就简单一些。

 

然而这还不够,再仔细分析一下,其实上面的结论还能再精简一些,从而得到下面的结论:

逻辑与操作符:当左边操作数为true(或可以转为布尔值true)的时候,返回右边操作数。当左边操作数为false(或可以转为布尔值false的时候,返回左边操作数

逻辑或操作符:当左边操作数true(或可以转为布尔值true)的时候,返回左边操作数。当左边操作数false(或可以转为布尔值false的时候,返回右边操作数

 

将结论放到例子中进行验证,完美匹配。这样我们就只需要记住最后的结论就可以了,而不用区分操作数的具体类型。不过,反正二者的结论是相反的。所以,单记住一条就可以了,另一条可以直接推出来。

 

知识共享许可协议
本作品采用知识共享署名 4.0 国际许可协议进行许可。

posted @ 2017-02-07 21:37  Francis_Li  阅读(369)  评论(0)    收藏  举报