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);			//この行は実行されません