JavaScriptでプログラミングを行う際、同じ処理を何度も繰り返す「ループ処理」は欠かせない要素の一つです。
多くの開発者はfor文やwhile文を頻繁に利用しますが、特定の条件下ではdo…while文が非常に強力なツールとなります。
本記事では、JavaScriptにおけるdo...while文の基本的な使い方から、他のループ構文との明確な違いまでを詳しく解説します。
繰り返し処理のバリエーションを増やすことで、より柔軟で効率的なコードが書けるようになるでしょう。
JavaScriptのdo…while文とは
do...while文は、指定した条件が真(true)である間、ブロック内の処理を繰り返し実行する制御構文です。
最大の特徴は、条件式の評価が処理の「後」に行われるという点にあります。
一般的なwhile文が「条件を確認してから実行する」のに対し、do...while文は「実行してから条件を確認する」という動きをします。
do…while文の基本構文
まずは、do...while文の書き方を確認してみましょう。
// do...while文の基本構文
do {
// 繰り返し実行したい処理
} while (条件式);
この構文では、まずdoブロックの中身が実行されます。
その後にwhileの括弧内にある条件式が評価され、結果が真であれば再びdoブロックに戻ります。
条件が偽(false)になった時点で、ループ処理は終了します。
必ず一度は実行されるという性質
do...while文において最も重要なポイントは、「条件に関わらず、最初の1回は必ず処理が実行される」ことです。
たとえ最初から条件式が偽であったとしても、一度目の処理を止めることはできません。
以下のサンプルコードで、その挙動を確認してみましょう。
let count = 10;
// 条件は「count < 5」なので、最初はすでに偽の状態
do {
console.log("このメッセージは必ず一度表示されます。現在の値: " + count);
count++;
} while (count < 5);
console.log("ループ終了後の値: " + count);
このメッセージは必ず一度表示されます。現在の値: 10
ループ終了後の値: 11
この例では、変数countが10であり、条件式count < 5は最初から成立していません。
しかし、doブロックが先に実行されるため、コンソールには一度だけメッセージが表示されます。
これが、後述する通常のwhile文との決定的な違いです。
while文とdo…while文の違い
JavaScriptには似たようなループ構文としてwhile文が存在しますが、これらは使い分けが重要です。
ここでは、両者の評価タイミングと実用面での違いを比較します。
前判定か後判定か
プログラミング用語では、処理の前に条件を判定することを「前判定」、処理の後に判定することを「後判定」と呼びます。
while文は前判定ループであり、最初から条件が満たされない場合は一度も実行されない可能性があります。
一方で、do...while文は後判定ループであるため、必ず一度は実行されることが保証されています。
比較表で見る違い
それぞれの特徴を整理すると、以下のようになります。
| 特徴 | while文 | do…while文 |
|---|---|---|
| 判定タイミング | 処理の実行前(前判定) | 処理の実行後(後判定) |
| 最低実行回数 | 0回 | 1回 |
| 主な用途 | 条件を満たす間だけ実行したい時 | 最低1回は動かし、その後継続を判断したい時 |
どちらを使うべきかの判断基準
基本的には、多くのケースでwhile文やfor文が選ばれます。
しかし、「ユーザーに入力を促し、その内容が不適切なら再入力させる」といった処理では、do...while文が最適です。
なぜなら、入力フォームを「表示する」というアクションは、チェックの前に必ず一度は必要だからです。
for文との違いと使い分け
for文もまた強力なループ構文ですが、do...while文とは活用シーンが異なります。
ここでは、開発現場でどのように使い分けるべきかを解説します。
回数が決まっているかどうか
for文は、繰り返す回数が事前に決まっている場合に適しています。
例えば、「配列の要素数分だけ繰り返す」や「10回だけ処理を行う」といったケースです。
対してdo...while文やwhile文は、「いつ終わるか分からないが、条件を満たすまで続けたい」という不確定な反復に適しています。
コードの可読性の観点
カウンタ変数(iなど)を使ってインクリメントを行う場合は、for文の方が1行に情報を集約できるため、コードがスッキリします。
do...while文でカウンタ変数を使うと、初期化・更新・条件がバラバラの場所に記述されるため、構造が複雑になりがちです。
// for文の場合:非常にシンプル
for (let i = 0; i < 3; i++) {
console.log(i + "番目の処理");
}
// do...while文の場合:記述が分散する
let i = 0;
do {
console.log(i + "番目の処理");
i++;
} while (i < 3);
したがって、数値をカウントアップするような処理には、原則としてfor文を利用しましょう。
do…while文の具体的な活用例
理屈だけでなく、実際の開発でどのようにdo...while文が使われるのか、具体的なケースを見ていきましょう。
ユーザー入力を受け取るバリデーション
ブラウザのprompt関数などを使い、正しい値が入力されるまでループを回す処理は、do...while文の独壇場です。
let input;
do {
// ユーザーに数字の入力を求める
input = prompt("1から10までの数字を入力してください");
// 文字列から数値に変換
input = parseInt(input, 10);
// 1〜10の範囲外であればループを継続
} while (isNaN(input) || input < 1 || input > 10);
console.log("正しく入力されました: " + input);
このコードでは、最初に必ず入力ダイアログが表示されます。
もし入力された値が条件に合わなければ、再びdoブロックに戻ってダイアログを表示します。
これをwhile文で書こうとすると、ループの外で一度promptを呼び出し、さらにループ内でも呼び出す必要があり、コードが重複してしまいます。
ランダムな値の生成と重複チェック
特定の条件を満たすランダムな値が得られるまで、何度も試行を繰り返したい場合にも有効です。
例えば、「既存のIDリストと重複しない新しいIDを生成する」といった処理です。
const existingIds = [101, 102, 105];
let newId;
do {
// 100〜109の範囲でランダムな整数を生成
newId = Math.floor(Math.random() * 10) + 100;
// 生成されたIDが既に存在するかチェック
} while (existingIds.includes(newId));
console.log("重複しない新しいIDを生成しました: " + newId);
まずIDを一つ作り、それが既存リストに含まれている間(trueの間)は作り直し続けるというロジックです。
注意点:無限ループを回避するために
ループ処理を記述する際に最も注意しなければならないのが、無限ループです。
条件式がいつまでも偽にならない場合、ブラウザの動作が停止したり、メモリを過剰に消費したりする恐れがあります。
変数の更新を忘れない
do...while文の中で条件式に関わる変数を更新し忘れると、ループが永遠に終わりません。
// 危険な例:無限ループになります
let k = 0;
do {
console.log("実行中...");
// kを増やす処理(k++)を忘れている
} while (k < 5);
ループ内では、必ず条件を終了に向かわせるための処理が含まれているか確認しましょう。
セミコロンの忘れに注意
JavaScriptの構文において、do...while文は特殊な形をしています。
通常のwhile文やfor文、if文の後にはセミコロンは不要ですが、do…while文の末尾にはセミコロンが必要です。
do {
// 処理
} while (条件); // このセミコロンが推奨される
JavaScriptの自動セミコロン挿入機能(ASI)によって省略しても動作することは多いですが、コードの可読性と予期せぬエラー防止のために必ず付ける習慣をつけましょう。
まとめ
JavaScriptのdo...while文は、最初の1回を確実に実行し、その結果を見て継続を判断するというユニークな特徴を持った構文です。
while文やfor文との使い分けを理解することで、冗長なコードを減らし、ロジックをよりシンプルに保つことができます。
特にユーザー入力の待機や、一度実行してみないと次のステップが決まらない動的な処理において、その真価を発揮します。
「まずは実行、判定は後」というこの構文の性質を正しく把握し、適切な場面で活用していきましょう。
無限ループへの対策と末尾のセミコロンといった基本ルールを守ることで、より安全で保守性の高いプログラムを記述できるようになるはずです。
