JavaScript/制御構造

プログラムはしばしば、特定の条件に基づいた決定や同じコードの反復が必要な場面に直面します。JavaScriptでは、このような状況に対処するために「制御構造」が利用されます。制御構造は、プログラムの実行フローを操作し、条件に応じてコードを分岐させたり、同じ処理を繰り返すための手段です。
JavaScriptの制御構造を理解することは、効果的で効率的なプログラミングの基本となります。これにより、コードの柔軟性が向上し、複雑なタスクにも対応できるようになります。次のステップでは、具体的な例を通じて制御構造の活用方法を学び、より高度なプログラミングスキルを養っていきましょう。
次のプログラムは、、
このコードは、「NaN(Not a Number)」という特殊な数値を扱うものです。まず、「use strict」が指定されているため、コードは厳密モードで実行されます。
次に、0を0で割った結果がnに格納されています。JavaScriptでは、0を0で割るとNaNが返ります。その後、nが負の数より小さいか、正の数より大きいか、0より大きいか、以上の条件分岐が行われます。
しかし、NaNは数値としては未定義であるため、比較演算子(<、>、=)を使って大小を比較することはできません。そのため、if文の条件式は一つでも成り立たなくなり、最後のelse節が実行されます。その結果、コンソールには「NaN」と出力されます。
この様な、分岐を始めとする制御構造はプログラミングを行う上で欠かせません。
if文( if statement )は「もし〜ならば」を表す条件分岐構文です。 if文では()の中に書かれた条件が truthy であるとき続く文が実行されます。 次のプログラムは、n < 0(nが0より小さい)という条件が真であるときのみ「負の数」と表示します。
if文のあとにelse節( else clause )を置くと、else節の文はif文の条件が falsy であるときのみ実行されます。 次のプログラムは、n < 0(nが0より小さい)という条件が真であれば「負の数」、さもなくば「自然数」と表示します。
if文とelse節をあわせてif/else文と呼びます。
else節の文をif文とすることで、次のように何個もつらねることができます。
なお、この場合は条件演算子を用いて簡潔に書くことができます。
if文の条件式はすべてtrueかfalseの真偽値として評価されます。たとえば、数値の0は真偽値に変換するとfalseになるので、次のif文のブロックは絶対に実行されません(デッドコード)。
整数の偶奇判別プログラムを書け。
if/else文を用いる場合は、
または
条件演算子を用いる場合は、
または
または
または
など。
[から]までは省略可能を意味し、この場合は「else節は省略可能」を意味します。
switch文( switch statement )は、if/else文を何個もつらねて書くことが冗長な場合にもちいられます。
これはswitch文を使って次のように書くことができます。
必ずcase節の最後にbreak文を書くのを忘れないでください。 なお、たいていのケースではswitch文を使わなくても、連想配列を応用したディスパッチテーブルで事足ります。 switch文はここぞというときに使ってください。
switch文に与えられた式に一致するcase句の値を上から順に厳密一致厳密比較演算子で評価され、true を返すcase句に対応する文が実行され、break文などの中断制御文が見つからない限り次の文が実行されます。
いよいよループの登場です。while文( while statement )は条件が真である間、文を実行しつづけます。
10回ループが回るとiが10になり、i < 10がfalseになるのでループを抜けます。 このようにwhile文はi < 10がtrueである間、ブロックを実行しつづけます。 このようにして、プログラムは0から9までの数字を表示します(10に達するとループから脱出します)。
while文に与えられた式が truthy の間、繰り返し文を実行します。
do-while文( do-while statement )は、まずdo文のブロックを実行し、次にwhile文の条件式を確認してループします。次のプログラムは0から9までの数字を表示します。
まず文を無条件に実行し、while文に与えられた式が truthy の間、繰り返し文を実行します。
for文( for statement )は、いわゆるC言語スタイルのfor文です。 let i = 0のような変数の初期化と、i < 10のような条件式と、i++のような変数の更新を一行で書く制御構文です。 JavaScriptではwhile文やdo-while文はあまり使われませんが、for文はループを簡潔に書けるので非常に重宝します。 次のプログラムは0から9までの数字を表示します。
結果、i < 10がtruthyである間、ブロックの実行と変数の更新が行われます。
ブロック文は文の特殊なケースで単文でももちろん有効です。
後置インクリメント演算子は変数の値を1増やし、増やす前の値を返すので、次のように書けます。
このような書き方を好み人もいますが、文意を汲むなら...
のような、iterableオブジェクトのイテレーションメソッドを使うことも検討に値します。
for-in 文は、オブジェクトのプロパティのうちキーが文字列で列挙可能なもの全てに反復処理を行います。
for-of 文は、Iterableオブジェクト(たとえば String Array や NodeList)に対して、反復処理を行います。
Iterableでないオブジェクトが右の項に与えらてた場合、TypeError が throw されます。
for await-of 文は、非同期関数用の for-of です。
for each-in 文はJavaScript 1.6でECMAScript for XML(E4X)のサポートの一環で導入されましたが、E4Xの廃止を受け非推奨を経て廃止されました。 下のプログラム例もモダンブラウザでは SyntaxError となります。for ... of 文を使うようにして下さい。 JavaScript 1.6で追加されたfor each-in文はオブジェクトの値を順番に取り出して反復処理します。
反復処理中に、反復を中断したり、「次の」反復にすぐに移りたい場合があります。 このようなときは、反復制御構文を使います。
break文( break statement )はループまたはswitch文を途中で抜けます。 次のプログラムはiが5になった時点でfor文のループを抜けるので、0から4までの数字を表示します。
continue文( continue statement )はループを次に進めます。 次のプログラムは0から9までの数字のうち3の倍数だけ表示します。
ラベルを使用すると深いループを一気に抜けることができます。
曖昧さを持ち込むためwith 文の使用は推奨されない。 また、strictモードでは SyntaxError となります。
with文の用途は、実際のコードを見ると良い。次の2つの関数は同じ意味です。
この様に、あらかじめオブジェクトをwith文で指定することで、それに続くブロックの間では、オブジェクトの名前を省略することが出来ます。 これは Pascal などの言語から移入されたものです。 with は、with により修飾名が省略されたことにより識別子に曖昧さを持ち込む事で、意図しないプロパティが使われるなど問題を生じることが知られており、with 文の使用は推奨されない。 また、strictモードでは SyntaxError となります。