非(NOT)、与(AND)和或(OR)。运算规则和数学中的非与或一样。
操作原理:首先会将它的操作数转换为一个布尔值,然后再对其求反。
转换规则参考:Boolean类型
两次逻辑非(!!),相当于一次Boolean()转换函数。
很重要的一点:
在有一个操作数不是布尔值的情况下,逻辑与操作就不一定返回布尔值;此时,它遵循下列规则:
条件 | 返回结果 |
第一个操作数是对象 | 第二个操作数 |
第二个操作数是对象 | 则只有在第一个操作数的求值结果为true的情况下才会返回该对象 |
两个数都是对象 | 第二个对象 |
有一个操作数是null | null |
有一个操作数是NaN | NaN |
有一个操作数是undefined | undefined |
浏览器控制台测试结果:
?
window && 11; //11 11 && window; //window对象 Navigator && window; //window window && Navigator; //Navigator null && window; //null NaN && window; //NaN undefined && window; //undefined
?
?
逻辑与操作属于短路操作,即如果第一个操作数能够决定结果,那么就不会再对第二个操作数求值。
逻辑或的规则
与逻辑与操作相似,如果有一个操作数不是布尔值,逻辑或也不一定返回布尔值,返回规则如下:
条件 | 返回值 |
第一个操作数是对象 | 第一个操作数 |
第一个操作数的求值结果为false | 第二个操作数 |
两个操作数都是对象 | 第一个操作数 |
两个操作数都是null | null |
两个操作数都是NaN | NaN |
两个操作数都是undefined | undefined |
与逻辑与的相似性
逻辑或操作符也是短路操作符。也就是说,如果第一个操作数的求值结果为true,就不会对第二个操作数求值了。
逻辑或的最佳实践
利用逻辑或的这一行为(上面说的)来避免为变量赋null或undefined值。
var myObject = preferredObject || backupObject;
代码分析:
变量myObject将被赋予等号后面两个值中的一个。变量preferredObject中包含优先赋给变量myObject的值,变量backupObject负责在preferredObject中不包含有效值的情况下提供后备值。
如果preferredObject的值不是null,那么它的值将被赋给myObject;如果是null,则将backupObject的值赋给myObject。
ECMAScript程序的赋值语句经常会使用这种模式。
原文:http://mirroravatar.iteye.com/blog/2188674