【JavaScript】制御命令まとめ
ちょっと多かったし時間かかったから混乱しているので
復習がてらにまとめてみるよ
プログラムには3つの構造がある
- 記述された順番に処理を行っていく順次(順接)
- 条件によって処理を分岐する選択
- 単純分岐を記述する(if命令)
- 多岐分岐を記述する(switch命令)
- 特定の処理を繰り返し実行する反復
- 条件式によってループを制御する(while/do..while命令)
- 指定回数だけループを処理する(for命令)
- 配列内の要素を順に処理する(for..in命令)
単純分岐を記述する(if命令)
if (条件式1) { 条件式1がtrueの場合に実行する命令 } [else if (条件式2) { 条件式2がtrueの場合に実行する命令 } [else { 全ての条件式がfalseの場合に実行する命令 }]]
- 「もし~だったら‥、さもなくば‥」という構造を表現するためのもの
- 与えられた条件式のtrue/falseという戻り値によって対応する命令(群)を実行する
- if命令の場合、複数の条件に合致する場合でも合致した最初のブロックのみ実行される(条件の順番には気をつけろ)
多岐分岐を記述する(switch命令)
switch (式) { case 値1 : 「式 = 値1」である場合に実行される命令(群) [case 値2 : 「式 = 値2」である場合に実行される命令(群) [case 値N : 「式 = 値N」である場合に実行される命令(群) ... [default : 式の値がすべての値に合致しない場合に実行される命令(群)]]] }
- 先頭の式がまず評価され、その値に一致するcaseブロックを実行する
- 一致するcaseブロックが見つからない場合には、最終的にdefaultブロックを呼び出す
- defaultブロックは任意だがどのcaseブロックにも一致しなかった場合の挙動を明確にするためにも省略しないことを推奨する
- switch命令は合致するcaseブロックに処理を移動するだけでcaseブロックを終了したところで自動的にswitchブロックから脱出するしくみは備えていない
- break命令を記述して処理中のcaseブロックから処理を脱出するようにするのが一般的
- break命令を指定していない場合、次のcaseブロックが続けて実行されてしまうので意図した結果が得られないので注意
条件式によってループを制御する(while/do..while命令)
while (条件式) { 条件式がtrueである時に実行される命令(群) }
do { 条件式がtrueである時に実行される命令(群) } while (条件式);
- あらかじめ与えられた条件式がtrueである間ループを繰り返す
- while命令
- ループの最初で条件式を判定する(前置判定)
- 条件によっては一度もループを実行しない
- do..while命令
- ループも最後で条件式を判定する(後置判定)
- 条件に関わらず、最低1回はループを実行する
- セミコロンを忘れやすいので注意
- この違いは「ループが開始される前から条件式がfalseである場合」に結果として現れる
指定回数だけループを処理する(for命令)
for (初期化式; ループ継続条件式; 増減式) { ループ内で実行する命令(群) }
- forブロックに入った最初のループで初期化式を一回だけ実行する
- 一般的にはこの初期化式でfor命令によるループ回数を管理するカウンタ変数を初期化する
- ループ継続条件式はブロック内の処理を継続するための条件式を表す
- ブロック内の処理が1回実行されるたびに増減式が実行される
- これらの式には基本的に任意の式を指定することができるが式の組む合わせによっては無限ループにもなりえるので注意が必要
- while/do..while命令でも記述できるが、変数の値によってループを制御する場合にはよりコンパクトにできる
配列内の要素を順に処理する(for..in命令)
for(仮変数 in 配列/オブジェクト) { ループ内で実行する命令(群) }
- 指定された配列/連想配列やオブジェクト配下の要素/メンバに対して先頭から順番に繰り返し処理を行う
- 仮変数には、配列/連想配列やオブジェクトから取り出された要素のインデックス番号やキー名、メンバ名が格納され、for..inブロックの中で要素値を参照する際に使用することができる
- 仮変数に格納されるのが要素値そのものではないことに注意
- for..inループを利用するのは連想配列、オブジェクトのキーを走査する場合に留め通常配列を走査する場合は原則としてforループを利用するようにする
- for..inループは配列のインデックス番号を取り出すだけなのでコードがあまりシンプルにならない(値そのものではないので、却って誤解を招く)
- 通常配列の内容を取り出す処理はコードによっては正しく動作しない場合がある
ループを途中でスキップ/中断する(break/continue命令)
break;
continue;
- break命令
- 特定の条件を満たした場合にループを強制的に中断したい場合にbreak命令を利用する
- continue命令
- 現在のループだけをスキップして次のループを継続して実行したいという場合はcontinue命令を使用する
- if命令とセットで利用するのが一般的
- ネストされたループの中でbreak/continue命令を使用した場合デフォルトでは最も内側のループを脱出/スキップする
ネストされたループを一気に脱出する(ラベル構文)
ラベル名 :
- ループのスクリプトの先頭にラベルを指定することができる
break ラベル名;
- break/continue命令側では上記のような形式でラベルを指定すると内側のループではなくラベルの付いたループを脱出することができる
例外処理(try..catch..finally命令)
try { 例外が発生するかもしれない命令(群) } catch(例外情報を受け取る変数) { 例外が発生した際に実行する命令(群) } [finally { 例外の有無に関わらず、査収的に実行される命令(群) }]
- 外部要因に依存する処理で完全に防ぐことのできない例外が発生した場合、スクリプト全体が停止しないように例外処理を実装する必要がある
- 例外情報はcatchブロックにErrorオブジェクトとして引き渡される
throw new Error(エラーメッセージ)
- 例外はプログラム中に発生したものを補足するばかりではなく自分で発生させることもできる
- 例外を発生させることを「例外をスローする」ともいう
- throw命令は多くの場合if命令のような条件分岐命令と一緒に使用される
こんなもんかー