1.逻辑与 &&
1) 返回值为数值:
true && true = (第二个值)
true && false = (第二个值)
false && true = (第一个值)
false && false = (第一个值)
console.log(3 && 0); //0
console.log(3 && 4); //4
console.log(0 && 4); //0
console.log(0 && ""); //0
2)返回值为布尔值:
var a=2,b=5; console.log(2>0 && 5<10) //true console.log(a>0 && b<10) //true
console.log(a>0 && “5”) //5
总结:
1)若逻辑与的两边是判断,则返回boolean值
2)若逻辑与的两边是数值,则返回对应number值
3)若逻辑与一边是判断,一边是数值,则返回数值
2.逻辑或 ||
true || true = (第一个值)
true || false = (第一个值)
false || true = (第二个值)
false || false = (第二个值)
代码验证过程如上面的逻辑与。
应用:在实际的项目中,我们经常用逻辑或来给变量赋值。例如:
var obj; obj= obj || {}; if(!obj){ obj={}; }
这两种方法的功能是一样的,但是第一种是不是看起来要简单,并且高大上一些呢。在来个例子:
bn.onclick=function(e){ e=e || window.event; } bn.onclick=function(e){ if(!e){ e=window.event; } }
可以很明显的感觉到第一种方法要比较好。
我们常常用这种方法来写单例模式,例如:
class Box{ static _instance; static getInstance(){ return Box._instance || (Box._instance=new Box()); } }
3.逻辑非 !
! 取逻辑反,先隐式转换布尔值,然后取反.
console.log(![]==false); console.log(![]===false); 结果:true true
解释:对象不能转换为字符串,console.log(String(obj(a:1,b:2)))--->[object,Object],数组可以转换为字符串,console.log(String([1,2,3]))--->1,2,3,
空数组[]--->"", ""==false==0 所以[]==false; 如果是这样的话,那么上面的运行的结果就是错的。到底是怎么回事呢?
“ ! 取逻辑反,先隐式转换布尔值,然后取反”,这句话很重要,在前面我总结的,只有空字符(""),0,false,undefined,null,NAN是false,其余的都是true,所以[]先隐式转换为true,然后![]===false
常用逻辑非来写开关,例如:
var bool=false; var bn=document.getElementById("bn"); bn.onclick=function(){ bool=!bool;//取反运算 bn.innerHTML=bool ? "开" : "关"; }