付録1: より(マイナーな)制御構造
¶ 第2章では、while
、for
、break
などのいくつかの制御文を紹介しました。単純にするために、私の経験でははるかに有用性が低い他のいくつかの文は省略しました。この付録では、これらの省略された制御文について簡単に説明します。
¶ まず、do
があります。do
はwhile
と似ていますが、ループ本体を0回以上実行する代わりに、1回以上実行します。do
ループは次のようになります。
do { var answer = prompt("Say 'moo'.", ""); print("You said '", answer, "'."); } while (answer != "moo");
¶ 条件がループが1回実行された後にのみチェックされるという事実を強調するために、ループの本体の最後に記述されています。
¶ 次に、continue
があります。これはbreak
と密接に関連しており、同じ場所で使うことができます。break
がループから抜け出し、プログラムをループ後に続行させるのに対し、continue
はループの次の反復にジャンプします。
for (var i = 0; i < 10; i++) { if (i % 3 != 0) continue; print(i, " is divisible by three."); }
¶ 同様の効果は通常、if
だけを使って生成できますが、continue
の方が見た目が良い場合もあります。
¶ ループが別のループの中に存在する場合、break
またはcontinue
文は内側のループのみに影響します。場合によっては、外側のループからジャンプしたいこともあります。特定のループを参照できるようにするために、ループ文にはラベルを付けることができます。ラベルは名前(有効な変数名であれば何でも構いません)にコロン(:
)を付けたものです。
outer: for (var sideA = 1; sideA < 10; sideA++) { inner: for (var sideB = 1; sideB < 10; sideB++) { var hypotenuse = Math.sqrt(sideA * sideA + sideB * sideB); if (hypotenuse % 1 == 0) { print("A right triangle with straight sides of length ", sideA, " and ", sideB, " has a hypotenuse of ", hypotenuse, "."); break outer; } } }
¶ 次に、switch
という構成があります。これは、いくつかの値に基づいて実行するコードを選択するために使用できます。これは非常に便利なことですが、JavaScriptがこれに対して使用する構文(Cプログラミング言語から採用した)は非常にぎこちなく見にくいので、通常はif
文の連鎖を代わりに使用することを好みます。
function weatherAdvice(weather) { switch(weather) { case "rainy": print("Remember to bring an umbrella."); break; case "sunny": print("Dress lightly."); case "cloudy": print("Go outside."); break; default: print("Unknown weather type: ", weather); break; } } weatherAdvice("sunny");
¶ switch
で開かれたブロック内には、いくつかのcase
ラベルを書くことができます。プログラムは、switch
に与えられた値に対応するラベル(値を===
と同等のものと比較するため、自動的な型変換なし)に、または一致する値が見つからない場合はdefault
にジャンプします。そして、そこで文の実行を開始し、break
文に到達するまで、他のラベルを越えて実行を続けます。例にある"sunny"
の場合のように、場合によっては、いくつかのコードをケース間で共有するために使用できます(晴れと曇りの両方で外に出ることを推奨しています)。ほとんどの場合、これは単に多くの見苦しいbreak
文を追加するか、または1つを追加するのを忘れたときに問題を引き起こします。
¶ ループと同様に、switch
文にはラベルを付けることができます。
¶ 最後に、with
というキーワードがあります。私は実際にプログラムでこれを使用したことはありませんが、他の人が使用しているのを見たことがあるので、それが何であるかを知っておくと便利です。with
を使用したコードは次のようになります。
var scope = "outside"; var object = {name: "Ignatius", scope: "inside"}; with(object) { print("Name == ", name, ", scope == ", scope); name = "Raoul"; var newVariable = 49; } show(object.name); show(newVariable);
¶ ブロック内では、with
に与えられたオブジェクトのプロパティが変数として機能します。ただし、新しく導入された変数は、このオブジェクトのプロパティとして追加されません。この構成の背後にある考え方は、オブジェクトのプロパティを多く使用するメソッドで役立つ可能性があるということだと思います。そのようなメソッドをwith(this) {...}
で開始して、その後ずっとthis
を書く必要がないようにできます。