本文章介紹ECMAScript Boolean 運算子
Boolean 運算子非常重要,它使得程式語言得以正常執行。
Boolean 運算子有三種:NOT、AND 和 OR。
ToBoolean 操作
在學習各種邏輯運算子之前,讓我們先了解一下 ECMAScript-262 v5 規範中描述的 ToBoolean 操作。
抽象操作 ToBoolean 將其引數按照下表中的規則轉換為邏輯值:
引數型別 | 結果 |
---|---|
Undefined | false |
Null | false |
Boolean | 結果等於輸入的引數(不轉換) |
Number | 如果引數為 +0, -0 或 NaN,則結果為 false;否則為 true。 |
String | 如果引數為空字串,則結果為 false;否則為 true。 |
Object | true |
邏輯 NOT 運算子
在 ECMAScript 中,邏輯 NOT 運算子與 C 和 Java 中的邏輯 NOT 運算子相同,都由感嘆號(!)表示。
與邏輯 OR 和邏輯 AND 運算子不同的是,邏輯 NOT 運算子返回的一定是 Boolean 值。
邏輯 NOT 運算子的行為如下:
- 如果運算數是物件,返回 false
- 如果運算數是數字 0,返回 true
- 如果運算數是 0 以外的任何數字,返回 false
- 如果運算數是 null,返回 true
- 如果運算數是 NaN,返回 true
- 如果運算數是 undefined,發生錯誤
通常,該運算子用於控制迴圈:
var bFound = false; var i = 0; while (!bFound) { if (aValue[i] == vSearchValues) { bFound = true; } else { i++; } }
在這個例子中,Boolean 變數(bFound)用於記錄檢索是否成功。找到問題中的資料項時,bFound 將被設定為 true,!bFound 將等於 false,意味著執行將跳出 while 迴圈。
判斷 ECMAScript 變數的 Boolean 值時,也可以使用邏輯 NOT 運算子。這樣做需要在一行程式碼中使用兩個 NOT 運算子。無論運算數是什麼型別,第一個 NOT 運算子返回 Boolean 值。第二個 NOT 將對該 Boolean 值求負,從而給出變數真正的 Boolean 值。
var bFalse = false; var sRed = "red"; var iZero = 0; var iThreeFourFive = 345; var oObject = new Object; document.write("bFalse 的邏輯值是 " + (!!bFalse)); document.write("sRed 的邏輯值是 " + (!!sRed)); document.write("iZero 的邏輯值是 " + (!!iZero)); document.write("iThreeFourFive 的邏輯值是 " + (!!iThreeFourFive)); document.write("oObject 的邏輯值是 " + (!!oObject));
結果:
bFalse 的邏輯值是 false sRed 的邏輯值是 true iZero 的邏輯值是 false iThreeFourFive 的邏輯值是 true oObject 的邏輯值是 true
邏輯 AND 運算子
在 ECMAScript 中,邏輯 AND 運算子用雙和號(&&)表示:
例如:
var bTrue = true; var bFalse = false; var bResult = bTrue && bFalse;
下面的真值表描述了邏輯 AND 運算子的行為:
運算數 1 | 運算數 2 | 結果 |
---|---|---|
true | true | true |
true | false | false |
false | true | false |
false | false | false |
邏輯 AND 運算的運算數可以是任何型別的,不止是 Boolean 值。
如果某個運算數不是原始的 Boolean 型值,邏輯 AND 運算並不一定返回 Boolean 值:
- 如果一個運算數是物件,另一個是 Boolean 值,返回該物件。
- 如果兩個運算數都是物件,返回第二個物件。
- 如果某個運算數是 null,返回 null。
- 如果某個運算數是 NaN,返回 NaN。
- 如果某個運算數是 undefined,發生錯誤。
與 Java 中的邏輯 AND 運算相似,ECMAScript 中的邏輯 AND 運算也是簡便運算,即如果第一個運算數決定了結果,就不再計算第二個運算數。對於邏輯 AND 運算來說,如果第一個運算數是 false,那麼無論第二個運算數的值是什麼,結果都不可能等於 true。
考慮下面的例子:
var bTrue = true; var bResult = (bTrue && bUnknown); //發生錯誤 alert(bResult); //這一行不會執行
這段程式碼在進行邏輯 AND 運算時將引發錯誤,因為變數 bUnknown 是未定義的。變數 bTrue 的值為 true,因為邏輯 AND 運算將繼續計算變數 bUnknown。這樣做就會引發錯誤,因為 bUnknown 的值是 undefined,不能用於邏輯 AND 運算。
如果修改這個例子,把第一個數設為 false,那麼就不會發生錯誤:
var bFalse = false; var bResult = (bFalse && bUnknown); alert(bResult); //輸出 "false"
在這段程式碼中,指令碼將輸出邏輯 AND 運算返回的值,即字串 "false"。即使變數 bUnknown 的值為 undefined,它也不會被計算,因為第一個運算數的值是 false。
提示:在使用邏輯 AND 運算子時,必須記住它的這種簡便計算特性。
邏輯 OR 運算子
ECMAScript 中的邏輯 OR 運算子與 Java 中的相同,都由雙豎線(||)表示:
var bTrue = true; var bFalse = false; var bResult = bTrue || bFalse;
下面的真值表描述了邏輯 OR 運算子的行為:
運算數 1 | 運算數 2 | 結果 |
---|---|---|
true | true | true |
true | false | true |
false | true | true |
false | false |
false |
與邏輯 AND 運算子相似,如果某個運算數不是 Boolean 值,邏輯 OR 運算並不一定返回 Boolean 值:
- 如果一個運算數是物件,並且該物件左邊的運算數值均為 false,則返回該物件。
- 如果兩個運算數都是物件,返回第一個物件。
- 如果最後一個運算數是 null,並且其他運算數值均為 false,則返回 null。
- 如果最後一個運算數是 NaN,並且其他運算數值均為 false,則返回 NaN。
- 如果某個運算數是 undefined,發生錯誤。
與邏輯 AND 運算子一樣,邏輯 OR 運算也是簡便運算。對於邏輯 OR 運算子來說,如果第一個運算數值為 true,就不再計算第二個運算數。
例如:
var bTrue = true; var bResult = (bTrue || bUnknown); alert(bResult); //輸出 "true"
與前面的例子相同,變數 bUnknown 是未定義的。不過,由於變數 bTrue 的值為 true,bUnknown 不會被計算,因此輸出的是 "true"。
如果把 bTrue 改為 false,將發生錯誤:
var bFalse = false; var bResult = (bFalse || bUnknown); //發生錯誤 alert(bResult); //不會執行這一行