基礎

JavaScriptのdo...while文入門|最低1回は実行するループの書き方

JavaScriptの do...while 文は、while 文と同様に条件が true の間処理を繰り返すループ構文ですが、条件の評価がループの末尾で行われるという重要な違いがあります。つまり、条件に関係なく最低1回はブロック内の処理が実行されます。

この記事では、do...while 文の基本構文と while 文との違い、そして「最低1回は実行したい」場面での実践的な使い方を解説します。

基本的な使い方

do...while 文は、まず do ブロック内の処理を実行し、その後 while の条件を評価します。条件が true ならもう一度 do ブロックを実行し、false ならループを終了します。

JavaScript
// 基本的な do...while 文
let count = 1;
do {
  console.log(count + '回目の実行');
  count++;
} while (count <= 5);
console.log('ループ終了');
実行結果
1回目の実行
2回目の実行
3回目の実行
4回目の実行
5回目の実行
ループ終了

この例の動作は while 文と同じです。しかし、初期値が条件を満たさない場合に違いが現れます。

while文との違い

最も重要な違いは、条件が最初から false の場合の動作です。while 文は一度も実行されませんが、do...while 文は必ず1回実行されます。

JavaScript
// while文:条件が最初からfalseなら実行されない
let a = 10;
while (a < 5) {
  console.log('while: ' + a);
  a++;
}
console.log('whileの後: aは' + a);

// do...while文:条件が最初からfalseでも1回は実行される
let b = 10;
do {
  console.log('do...while: ' + b);
  b++;
} while (b < 5);
console.log('do...whileの後: bは' + b);
実行結果
whileの後: aは10
do...while: 10
do...whileの後: bは11

while 文は条件が false なのでブロック内を一切実行せず、a は10のままです。一方、do...while 文はまず1回実行されるため、b は11になっています。この「最低1回の実行保証」が do...while 文の最大の特徴です。

実践例:メニュー選択ループ

ユーザーに入力を求め、有効な入力が得られるまで繰り返す処理は do...while の代表的な使用例です。

JavaScript
// サイコロを振って6が出るまで繰り返す
let dice;
let rollCount = 0;

do {
  dice = Math.floor(Math.random() * 6) + 1;
  rollCount++;
  console.log(rollCount + '回目: ' + dice + 'が出ました');
} while (dice !== 6);

console.log('6が出るまで' + rollCount + '回かかりました');

// 数値を桁ごとに分解する
let number = 12345;
const digits = [];

do {
  digits.unshift(number % 10);  // 1の位を取得して先頭に追加
  number = Math.floor(number / 10);  // 1桁右にシフト
} while (number > 0);

console.log('各桁:', digits);
実行結果
1回目: 2が出ました
2回目: 4が出ました
3回目: 6が出ました
6が出るまで3回かかりました
各桁: [1, 2, 3, 4, 5]

サイコロの例では、まずサイコロを振る(実行する)必要があり、その結果を見て続けるか判断するため、do...while が自然なロジックになります。数値の桁分解も、0の場合でも最低1桁(0自身)を処理する必要があるため、do...while が適しています。

実践例:リトライ処理

JavaScript
// API呼び出しのリトライパターン
async function fetchWithRetry(url, maxRetries = 3) {
  let attempt = 0;
  let lastError;

  do {
    attempt++;
    try {
      console.log(attempt + '回目の試行...');
      const response = await fetch(url);
      if (response.ok) {
        console.log('成功しました');
        return await response.json();
      }
      throw new Error('HTTP ' + response.status);
    } catch (error) {
      lastError = error;
      console.log('失敗: ' + error.message);
      if (attempt < maxRetries) {
        const wait = attempt * 1000;
        console.log(wait + 'ms後にリトライ...');
      }
    }
  } while (attempt < maxRetries);

  throw new Error(maxRetries + '回試行しましたが失敗しました: ' + lastError.message);
}

API呼び出しのリトライ処理は do...while の典型的なユースケースです。まず1回は必ずリクエストを送信する必要があり、失敗した場合にのみリトライを判断します。

セミコロンを忘れずに

do...while 文の末尾 while (条件); にはセミコロンが必要です。while 文の場合は不要なので混同しやすいポイントです。ただし、多くの場合セミコロンがなくても動作しますが、文法的には必要です。

do...while の使いどころを見極める

do...whilewhile 文に比べて使用頻度が低く、多くの場面では while 文や for 文で代替できます。「最低1回は実行する必要がある」ことがロジック上明確な場合にのみ使いましょう。無理に使うとコードの意図が伝わりにくくなることがあります。

まとめ

  • do...while 文は条件の評価がループの末尾で行われるため、最低1回は必ず実行される
  • while 文は条件が最初から false なら一度も実行されないが、do...while は1回実行される
  • ユーザー入力の検証、リトライ処理、サイコロのような「まず実行してから判定」するロジックに適している
  • 末尾の while (条件); にはセミコロンが必要
  • 使用頻度は低いので、必要な場面を見極めて使う