轉 完全理解js中的&&和||

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()

相關文章
相關標籤/搜索