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 国际许可协议进行许可。

浙公网安备 33010602011771号