在js中经常能看到以下的写法:
var obj1 = a || b || c; var obj2 = a && b && c;
刚看到时,很容易认为返回的两个变量都是 boolean 类型,但实际上返回的却是 a、b、c的其中之一。
其实这是一种相对安全并且高效的适配写法,可以避免过多的 if 判断,使代码看上去更简洁。
首先,|| 和 && 比较抽象的逻辑是:
1、a || b,如果a不存在,则返回b
2、a && b,如果a存在,则返回b,否则返回a
这种逻辑理解起来确实有点抓狂
本质是什么呢?
&& 和 || 的作用只有一个:进行布尔值的且和或的运算。当运算到某一个变量就得出最终结果之后,就返回哪个变量。
在javascript中:
以下内容会被当成false处理:"" , false , 0 , null , undefined , NaN
其他都是true。注意:字符串"false"也会被当做true处理,在未转型的情况下他是字符串,属于一个对象,所以是true。
所以:
a || b: 如果a是true,那么b不管是true还是false,都返回true。因此不用判断b了,这个时候刚好判断到a,因此返回a。
如果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。