前幾天看到一個函數,百思不得其解,今天早上醒來看了本js的書,正好講到操作符的用法,給大家分享下js中的&&,||,和我們用的其他的編程語言還是有點區別的。
直接上那個函數的代碼:
function whatDoesItDo(mood){ return mood && "I like this" || "I don't like this"; }
當我們給mood賦值true其顯示"I like this"(A來代替) 賦值false 顯示"I dont like this"(B來代替),或者我們給mood 賦值個字符串,其也會顯示 A,按理說應該返回true或者false,真是不明白,看了書才明白
邏輯與(&&)操作可以應用於任何的操作類型,不僅僅是布爾值,在有一個操作數不是布爾值的情況下,&&操作符就不一定返回布爾值:遵循下面規則:
以A&&B為例:
1如果第一個操作數是對象則返回第二個操作數,如果A是對象就返回B,
2,如果第二個操作數是對象,則只有在 第一個操作數求值為true的情況下才會返回該對象
&&操作屬於短路操作,只要第一個操作數能夠決定結果就不再操作第二個操作數了,所以第一個函數因為前面是個false,因為已經可以決定結果就是false,不再操作dd了,即使其未定義,第二個函數因為第一個操作數是true不能決定結果,所以會繼續操作dd,發現dd未定義,這就會報錯,第三個函數,以為第一個操作數是true也是個對象,所以遵照第一條,返回"dd"
3,如果兩個都是對象返回第二個
4,如果有一個是null,則返回null
"dd"&&null 返回null;false&&null;返回false,因為第一個已經決定結果,所以不再執行下一個操作數
5,如果有一個是NaN,則返回NaN
6,如果有一個操作數為undefined就返回undefined
邏輯或(||)和邏輯與的操作相類似,只要有一個不是布爾值,||也不一定返回布爾值,遵循下面規則:
1,如果是第一個是對象就返回第一個,下面我們就很容易理解開頭那個函數怎么回事了,如果mood是一個對象的話,首先&&操作返回“I like this”,然后進行||操作,因為(mood&&"Iike this")是對象,所以再進行||,就返回mood&&"Iike this",所以結果為"I like this".
2,如果第一個求值的結果是false,則返回第二個操作數
啥都不說了自己看吧
3,如果兩個操作數都是對象,返回第一個
4,如果都是null,NaN,undefined,則返回null,NaN,undefined;
對於A||B,如果A為true則不會操作B,如果A為false則會繼續操作B
對於null的操作,
var C=A||B,
如果A為null,則返回B,如果A不為null,直接返回A,B起到一個后備的作用;
歡迎大家關注我討論js問題我是Rhino