在js中常常能看到如下的寫法:javascript
var obj1 = a || b || c; var obj2 = a && b && c;
剛看到時,很容易認爲返回的兩個變量都是 boolean 類型,但實際上返回的倒是 a、b、c的其中之一。java
其實這是一種相對安全而且高效的適配寫法,能夠避免過多的 if 判斷,使代碼看上去更簡潔。安全
首先,|| 和 && 比較抽象的邏輯是:spa
一、a || b,若是a不存在,則返回bcode
二、a && b,若是a存在,則返回b,不然返回a對象
這種邏輯理解起來確實有點抓狂blog
本質是什麼呢?
&& 和 || 的做用只有一個:進行布爾值的且和或的運算。當運算到某一個變量就得出最終結果以後,就返回哪一個變量。
在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了嗎。ip
a && b: 若是a是false,那麼b無論是true仍是false,都返回false,所以不用判斷b了,這個時候恰好判斷到a,所以返回a。
若是a是true,那麼就要在判斷b,和剛剛同樣,無論b是true是false,都返回b。字符串