Microsoft® JScript
プログラム フローの制御
 チュートリアル  


実行フローを制御する
一般に、どのようなスクリプトでも実行時の条件に応じて異なる処理を行うことがあります。たとえば、1 時間おきに時刻を調べ、1 日のうちの時間帯に応じてパラメータを適切に変更するスクリプトを記述したり、ユーザーからの入力を受け取って入力内容に応じて処理を行うスクリプトを記述したりします。また、決まった処理を繰り返すスクリプトを記述する場合も、繰り返し処理を終了するかどうかを判断するために条件を設定することになります。

評価できる条件には、いくつかの種類があります。Microsoft JScript では、すべての条件がブール値で表されるため、条件を評価したときに返される値は真 (true) または偽 (false) のどちらかになります。ブール型、数値型、および文字列型は自由に評価することができます。

JScript には、さまざまな制御構造が用意されています。これらの制御構造のうち最も単純なものは、条件ステートメントです。

条件ステートメントを使用する
JScript では、条件ステートメントとして if および if...else がサポートされています。if ステートメントで条件を評価すると、評価した条件が満たされる場合にだけ、何らかの JScript コードが実行されます (if...else ステートメントの場合は、条件が満たされないときに別のコードが実行されます)。 単純な if ステートメントの場合、全体を 1 行に納めて記述することもできます。一般には、if ステートメントや if...else ステートメントは複数の行に渡って記述されることになります。

次に、if ステートメント、および if...else ステートメントを使用した例を示します。1 つ目の例は、単純なブール値の評価を行っています。かっこに囲まれた部分の評価結果が真 (True) だった場合にのみ、if ステートメントの後ろのブロック内に記述されたステートメントが実行されます。

// smash() 関数は、同じコード内の別の場所で定義されているものとします。
if (newShip) smash(champagneBottle,bow);  // newShip が真かどうかを調べるブール値評価。

// この例では、両方の条件が真にならなければ、if ステートメントが真だとは見なされません。
if (rind.color == "濃い黄色" && rind.texture == "大小のしわ付")  {
        theResponse = ("それはクレンショーメロンですか ? <br> ");
        }


// この例では、2 つの条件のいずれかが真であれば、if ステートメントは真だと見なされます。
var theReaction = "";
if ((lbsWeight < 15) || (lbsWeight > 45))  {
    theReaction = ("なんてかわいいネコでしょう ! <br>");
    }
    else
        theReaction = ("随分大きいネコですね ! <br>");
条件演算子を使用する
JScript では、条件演算子もサポートされています。条件演算子では、疑問符の後ろにテストする条件を記述し (条件の前に if は記述しません)、その後ろに 2 種類の処理を指定します。この 2 種類の処理のうちの片方は条件が満たされる場合の使用されます。他方は条件が満たされない場合に使用されます。この 2 種類の処理は、コロンで区切ります。

var hours = "";

// このコードは、hours に theHour の値を入れるか、
// theHour - 12 の値を入れるかを調べています。

hours += (theHour >= 12) ? theHour - 12 + " PM" : theHour + " AM";


ヒント    複数の条件を組み合わせて一緒に評価する場合、その中に結果を予測できる条件が含まれるときは、各条件を評価する順番を調整することで実行速度を速くすることができます。どのような順番が効果的かどうかは、各条件を OR (||) で結合するのか AND (&&) で結合するのかにより異なります。たとえば、3 つの条件がすべて真にならなければならない場合、2 つ目の条件が偽ならば 3 つ目の条件は評価されません。同様に、複数の条件のうち 1 つでも真になればよい場合には、どれか 1 つでも条件が真になった時点で評価処理が終了します。この調整は、評価する条件に関数の呼び出しや長いコードが含まれている場合に特に効果的です。


ループ (繰り返し処理) を使用する
1 つのステートメントや複数のステートメントが入ったブロックを繰り返し実行する方法には、いくつかの種類があります。一般に、繰り返し実行は "ループ" と呼ばれます。通常、ループの制御は、ループ内の処理が実行されるたびに値が変化する何らかの変数を評価して行います。Microsoft JScript では、for ループ、for...in ループ、および while ループの 3 種類のループがサポートされています。

for ループ
for ステートメントには、カウンタ変数、評価する条件、およびカウンタを更新する処理を指定します。指定した条件は、ループが 1 度実行される (この実行を、ループのワン パスまたは 1 回の反復処理と呼びます) 直前に評価されます。カウンタ変数は、ループの実行後、次の反復処理が開始される前に更新されます。

ループに指定した条件がループ処理を開始する時点で満たされてない条件の場合は、ループは 1 度も実行されません。逆に、評価する条件が必ず真になる条件の場合は、無限にループ処理を繰り返します。通常は、どちらの場合も発生してはならない状況です。ループを設計する場合には注意してください。

/*
更新式 (次の例では "icount++") はループの最後に、つまりループ本体の
ステートメントの実行が完了し、条件が評価される直前に実行されます。
*/

var howFar = 11;  // ループの上限を 11 に設定します。

var sum = new Array(howFar);  // 添字が 0 〜 10 の 11 個のメンバを持つ sum という配列を作成します。
var theSum = 0;
sum[0] = 0;

for(var icount = 1; icount < howFar; icount++)  {  // このループでは、1 から 10 までカウントされます。
theSum += icount;
sum[icount] = theSum;
}


var newSum = 0;
for(var icount = 1; icount > howFar; icount++)  {  // このループは 1 度も実行されません。
newSum += icount;
}


var sum = 0;
for(var icount = 1; icount > 0; icount++)  {  // これは無限ループとなります。
sum += icount;
}
一般に、ループのカウンタ変数には、慣習的に "i"、"j"、"k"、"l"、"m"、"n" などで始まる名前が使用されています。これらの文字 1 文字をカウンタ変数の名前に使用する場合もあります。この慣習に従うと、ループのカウンタ変数であるということが誰にでもすぐにわかるという利点があります。

for...in ループ
オブジェクト内のすべてのプロパティを 1 つずつ処理するために用意されたループです。for...in ループのループ カウンタには、配列内のすべての要素のインデックスが使用されます。このインデックスは、数字ではなく文字列です。

for (j in tagliatelleVerde)  // tagliatelleVerde は複数のプロパティを持つオブジェクトです。
{
// 具体的な処理を行う JScript コードのステートメント。
}
while ループ
while ループは、for ループと似ています。ただし、for ループと異なりカウンタ変数と更新式がありません。決められた回数だけ処理を繰り返すではなく、特定の変数や状態の変化を条件としてステートメント (またはブロック) のループ処理を行いたい場合に、for ループより while ループの方が適しています。

var theMoments = "";
var theCount = 42;        // カウンタ変数を初期化します。
while (theCount >= 1)  {
    if (theCount > 1)  {
        theMoments = "残り " + theCount + " カウントです!";
    }
    else  {
        theMoments = "あと 1 です!";
    }
theCount--;        // カウンタ変数を更新します。
}
theMoments = "発射!";


  while ループには、明示的なカウンタ変数がありません。このため、ほかの種類のループと比べて無限ループになってしまう可能性が高まります。また、while ループを使用すると、ループを制御する条件がどこで更新されるのかわかりにくいコードも記述できるため、条件が更新されないループを記述してしまう可能性もあります。while ループを使用してコードを記述する場合、無限ループを作らないように特に注意してください。


break ステートメントと continue ステートメント
ループの実行を中止するために用意されているステートメントです。break ステートメントを使用すると、特別な条件が満たされたときに実行を中止することができます。continue ステートメントを使用すると、コード ブロックの残りの部分を実行しないで通常どおりカウンタ変数を更新した後 (ただし、for または for...in の場合のみカウンタ変数の更新が行われます) 、次の反復処理に移ることができます。


  while ループで continue ステートメントを使用すると、無限ループになってしまう可能性が高まります。この 2 つを組み合わせて使う場合には十分注意してください。

var theComment = "";
var theRemainder = 0;
var theEscape = 3;
var checkMe = 27;
for (kcount = 1; kcount <= 10; kcount++) 
{
    theRemainder = checkMe % kcount;
    if (theRemainder == theEscape)
      {
            break;  // 剰余が初めて theEscape の値と等しくなったところで、ループから抜けます。
}
theComment = checkMe + "  " + kcount + " で割ったときの余りは " + theRemainder + "です。";
}

for (kcount = 1; kcount <= 10; kcount++) 
{
   theRemainder = checkMe % kcount;
   if (theRemainder != theEscape) 

   {
      continue;  // theEscape の値と等しい剰余だけを選択し、その他の剰余は無視します。
}
// 選択された剰余を使う JScript コード。
}


var theMoments = "";
var theCount = 42;  // カウンタを初期化します。
while (theCount >= 1)  {
// if (theCount < 10)  {  // 警告!
// このような continue を使うと、無限ループに陥ります!
// continue;
// }
    if (theCount > 1)  {
        theMoments = "残り " + theCount + " カウントです!";
}
    else  {
        theMoments = "あと 1 です!";
    }
theCount--;  // カウンタを更新します。
}
theCount = "発射!";

© 1997 Microsoft Corporation.