do...while
Baseline
Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since 2015年7月.
do...while 文は、指定された文を、テスト条件が偽に評価されるまで実行するループを作成します。条件は文を実行した後に評価されます。結果として、指定された文は少なくとも 1 回は実行されます。
試してみましょう
let result = "";
let i = 0;
do {
i += 1;
result += i;
} while (i < 5);
console.log(result);
// 予想される結果: "12345"
構文
do
statement
while (condition);
解説
他のループ文と同様に、statement の中でフロー制御文を使用することができます。
do...while 文の構文では末尾にセミコロンが要求されますが、セミコロンがないことで構文が不正な状態になる場合、自動セミコロン挿入処理によって自動的に挿入されることがあります。
例
do...while の使用
次の例では、 do...while ループを少なくとも 1 回は実行し、 i が 5 より小さいという条件を満たさなくなるまで反復します。
let result = "";
let i = 0;
do {
i += 1;
result += `${i} `;
} while (i > 0 && i < 5);
// i === 0 であっても、このループは検査なしで始まるため、ループが実行される
console.log(result);
do...while の条件として false を使用
この文は常に一度だけ実行されるため、do...while (false) は文自体を実行するのと同じです。これは C 系言語でよく使われる手法であり、break を使用して分岐ロジックを早期に抜け出すことができるようになります。
do {
if (!user.loggedIn) {
console.log("ログインしていません");
break;
}
const friends = user.getFriends();
if (!friends.length) {
console.log("友達が見つかりません");
break;
}
for (const friend of friends) {
handleFriend(friend);
}
} while (false);
// The rest of code
JavaScript では、break をつけてラベル付きブロック文を使用するなど、いくつかの代替手段があります。
handleFriends: {
if (!user.loggedIn) {
console.log("ログインしていません");
break handleFriends;
}
const friends = user.getFriends();
if (!friends.length) {
console.log("友達が見つかりません");
break handleFriends;
}
for (const friend of friends) {
handleFriend(friend);
}
}
または関数を使用する方法もあります。
function handleFriends() {
if (!user.loggedIn) {
console.log("ログインしていません");
return;
}
const friends = user.getFriends();
if (!friends.length) {
console.log("友達が見つかりません");
return;
}
for (const friend of friends) {
handleFriend(friend);
}
}
条件として代入文を使用
場合によっては、次のように、代入を条件として使用することが理にかなうことがあります。
do {
// …
} while ((match = regexp.exec(str)));
場合によっては、条件として代入を使用することは意味があります。しかし、その場合、正しい方法と間違った方法があります。while のドキュメントでは、代入を条件として使用の節で、知っておくべき、そして従うべき一般的な良い実践例を示しています。
仕様書
| Specification |
|---|
| ECMAScript® 2026 Language Specification # sec-do-while-statement |