付録1: より(マイナーな)制御構造

第2章では、whileforbreakなどのいくつかの制御文を紹介しました。単純にするために、私の経験でははるかに有用性が低い他のいくつかの文は省略しました。この付録では、これらの省略された制御文について簡単に説明します。


まず、doがあります。dowhileと似ていますが、ループ本体を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を書く必要がないようにできます。