ECMAScript Boolean 演算子
Boolean 演算子は非常に重要で、プログラム言語が正しく動作するために必要です。
Boolean 演算子には、NOT、AND、ORの3種類があります。
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; } 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を返します。
- ある演算値が未定義である場合、エラーが発生します。
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 が返されます。
- ある演算値が未定義である場合、エラーが発生します。
論理 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); //この行は実行されません