布爾運算符的主要功能是測試兩個值的關係,是條件語句和循環語句的基礎,布爾運算符一共有3個:非(NOT)、與(AND)和或(OR)。
一、邏輯非
邏輯非操作符由一個嘆號(!)表示,可以應用於ECMAScript中的任何值。無論這個值是什麼數據類型,這個操作符都會返回一個布爾值。邏輯非操作符首先會將它的操作數轉換為一個布爾值,然後再對其求反。邏輯非操作符遵循下列規則:
如果操作數是一個對象,返回false。如果操作數是一個空字符串,返回true。如果操作數是一個非空字符串,返回false。如果操作數是數值0,返回true。如果操作數是任意非0數值(包括Infinity),返回false。如果操作數是null,返回true。如果操作數是NaN,返回true。如果操作數是undefined,返回true。邏輯非操作符也可以用於講一個值轉換為與其對應的布爾值。同時使用兩個邏輯非操作符,實際上就會模擬Boolean()轉型函數的行為。其中,第一個邏輯非操作會基於無論什麼操作數返回一個布爾值,而第二個邏輯非操作則對該布爾值求反,於是就得到了這個值真正對應的布爾值。
alert(!"blue"); //false
alert(!0); //true
alert(!!"blue"); //true
alert(!!0); //false
二、邏輯與
邏輯與操作符由兩個和號(&&)表示,有兩個操作數,邏輯與的真值表如下:
即兩個操作數都為true的時候才返回true,否則返回false。
邏輯與操作可以應用於任何類型的操作數,而不僅僅是布爾值。在有一個操作數不是布爾值的情況下,邏輯與操作就不一定返回布爾值,此時它遵循下列規則:
如果第一個操作數是對象,則返回第二個操作數。如果第二個操作數是對象,則只有在第一個操作數的求職結果為true的情況下才會返回該對象。如果兩個操作數都是對象,則返回第二個操作數。如果有一個操作數為null,則返回null。如果有一個操作數是undefined,則返回undefined。邏輯與操作屬於短路操作,即如果第一個操作數能夠決定結果,那麼就不會再對第二個操作數求值。對於邏輯與操作而言,如果第一個操作數是false,則無論第二個操作數是什麼值,結果都不再可能是true了。另外,不能在邏輯與操作中使用未定義的值,這會導致錯誤。
var result = true || false;var found = true;var result = (found && someUndefinedVariable); //這裡會發生錯誤alert(result); //這一行不會執行var found = false;var result = (found && someUndefinedVariable); //短路操作,不會發生錯誤alert(result); //false
三、邏輯或
邏輯或操作符由兩個豎線符號(||)表示,有兩個操作數,邏輯或的真值表如下:
兩個操作數都為false的時候才返回false,否則返回true。
與邏輯與操作相似,如果有一個操作數不是布爾值,邏輯或也不一定返回布爾值,此時遵循下列規則:
如果第一個操作數是對象,則返回第一個操作數。如果第一個操作數的求值結果為false,則返回第二個操作數。如果兩個操作數都是對象,則返回第一個操作數。如果兩個操作數都是null,則返回null。如果兩個操作數都是NaN,則返回NaN。如果兩個操作數都是undefined,則返回undefined。與邏輯與操作符相似,邏輯或操作符也是短路操作符。也就是說,如果第一個操作數的求值結果為true,就不會對第二個操作數求值了。另外,同樣不能在邏輯或操作中使用未定義的值,這會導致錯誤。
我們可以利用邏輯或的這一行為來避免為變量賦null或undefined值。
var myObject = preferredObject || backupObject;
變量myObject將被賦予等號後面兩個值中的一個。變量preferredObject中包含優先賦給變量的值,若preferredObject中不包含有效值,則將變量backupObject中的值賦給變量myObject。ECMAScript程序的賦值語句經常使用這種模式。