javascript中,&&和||的用法比较神奇,常常用在对象上,例如a || b,若是a不存在,则返回b。a && b,若是a存在,则返回b,不然返回a。javascript
光这样看,感受他的概念还挺复杂的,这样去想的话,不但会在脑子里多出一个无用的概念,并且越记越混乱。看问题仍是要看本质。java
本质是什么呢?&& 和 || 的做用只有一个(定义):spa
进行布尔值的且和或的运算。当运算到某一个变量就得出最终结果以后,就返回哪一个变量。code
在javascript中:对象
如下内容会被当成false处理:"" , false , 0 , null , undefined , NaNblog
其余都是true。注意:字符串"false"也会被当作true处理,在未转型的状况下他是字符串,属于一个对象,因此是true。ip
因此:字符串
a || b:若是a是true,那么b无论是true仍是false,都返回true。所以不用判断b了,这个时候恰好判断到a,所以返回a。class
若是a是false,那么就要判断b,若是b是true,那么返回true,若是b是false,返回false,其实不就是返回b了吗。变量
a && b:若是a是false,那么b无论是true仍是false,都返回false,所以不用判断b了,这个时候恰好判断到a,所以返回a。
若是a是true,那么就要在判断b,和刚刚同样,无论b是true是false,都返回b。
来个复杂的例子(注意一点:在js中&&运算符优先级大于||)
假设:
var a=new Object(),b=0,c=Number.NaN,d=1,e="Hello";
alert(a || b && c || d && e); 表达式从左往右执行,先&&后||
一、(b && c):b是false,此时不须要判断c,由于无论c是true是false,最终结果必定是false,所以返回当前判断对象b,也就是0;
二、(d && e):d是true,这个时候判断e,此时无论e是true,是false,返回结果必定是e,e为true,所以返回"Hello";
三、(a || b):a是true,此时无论b是true是false,结果都是true,因此不判断b,因此返回当前判断对象a,所以返回new Object();
四、(a || e):同上,所以返回a。
这个表达式最终结果为a,也就是new Object()