JavaScriptの do...while 文は、while 文と同様に条件が true の間処理を繰り返すループ構文ですが、条件の評価がループの末尾で行われるという重要な違いがあります。つまり、条件に関係なく最低1回はブロック内の処理が実行されます。
この記事では、do...while 文の基本構文と while 文との違い、そして「最低1回は実行したい」場面での実践的な使い方を解説します。
基本的な使い方
do...while 文は、まず do ブロック内の処理を実行し、その後 while の条件を評価します。条件が true ならもう一度 do ブロックを実行し、false ならループを終了します。
// 基本的な 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回実行されます。
// 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は11while 文は条件が false なのでブロック内を一切実行せず、a は10のままです。一方、do...while 文はまず1回実行されるため、b は11になっています。この「最低1回の実行保証」が do...while 文の最大の特徴です。
実践例:メニュー選択ループ
ユーザーに入力を求め、有効な入力が得られるまで繰り返す処理は do...while の代表的な使用例です。
// サイコロを振って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 が適しています。
実践例:リトライ処理
// 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 は while 文に比べて使用頻度が低く、多くの場面では while 文や for 文で代替できます。「最低1回は実行する必要がある」ことがロジック上明確な場合にのみ使いましょう。無理に使うとコードの意図が伝わりにくくなることがあります。
まとめ
do...while文は条件の評価がループの末尾で行われるため、最低1回は必ず実行されるwhile文は条件が最初からfalseなら一度も実行されないが、do...whileは1回実行される- ユーザー入力の検証、リトライ処理、サイコロのような「まず実行してから判定」するロジックに適している
- 末尾の
while (条件);にはセミコロンが必要 - 使用頻度は低いので、必要な場面を見極めて使う