do...while

Baseline 已广泛支持

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 ⁨2015 年 7 月⁩以来,各浏览器均已提供此特性。

do...while 语句创建了一个循环,只要测试条件评估为真,它就会执行指定的语句。条件在执行语句后进行评估,导致指定的语句至少执行一次。

试一试

let result = "";
let i = 0;

do {
  i += 1;
  result += i;
} while (i < 5);

console.log(result);
// Expected output: "12345"

语法

js
do
  statement
while (condition);
statement

一个语句,至少执行一次,并且只要条件评估为真就会重新执行。你可以使用块语句来执行多个语句。

条件

在每次循环评估为真后进行评估的表达式。如果此条件评估为真,则statement将重新执行。当条件评估为假时,执行将继续进行do...while循环之后的语句。

描述

像其他循环语句一样,你可以在 statement 中使用控制流语句

  • break 会停止 statement 的执行,并跳转到循环之后的第一条语句。
  • continue停止statement执行并重新评估condition

do...while语句的语法要求末尾有一个分号,但如果缺少分号导致语法无效,自动分号插入过程可能会为你插入一个。

示例

使用 do...while

在下面的示例中,do...while循环至少迭代一次,并重复迭代直到i不再小于 5。

js
let result = "";
let i = 0;
do {
  i += 1;
  result += `${i} `;
} while (i > 0 && i < 5);
// Despite i === 0 this will still loop as it starts off without the test

console.log(result);

使用 false 作为 do...while 条件

由于语句总是执行一次,do...while (false)与执行语句本身相同。这是 C 语言中的一种常见惯用法,它允许你使用break来提早跳出分支逻辑。

js
do {
  if (!user.loggedIn) {
    console.log("You are not logged in");
    break;
  }
  const friends = user.getFriends();
  if (!friends.length) {
    console.log("No friends found");
    break;
  }
  for (const friend of friends) {
    handleFriend(friend);
  }
} while (false);
// The rest of code

在 JavaScript 中,有一些替代方法,例如使用带有break标签块语句

js
handleFriends: {
  if (!user.loggedIn) {
    console.log("You are not logged in");
    break handleFriends;
  }
  const friends = user.getFriends();
  if (!friends.length) {
    console.log("No friends found");
    break handleFriends;
  }
  for (const friend of friends) {
    handleFriend(friend);
  }
}

或者使用函数

js
function handleFriends() {
  if (!user.loggedIn) {
    console.log("You are not logged in");
    return;
  }
  const friends = user.getFriends();
  if (!friends.length) {
    console.log("No friends found");
    return;
  }
  for (const friend of friends) {
    handleFriend(friend);
  }
}

使用赋值作为条件

在某些情况下,使用赋值作为条件可能是有意义的,例如这样

js
do {
  // …
} while ((match = regexp.exec(str)));

但当你这样做时,会存在可读性权衡。while文档有一个使用赋值作为条件部分,其中包含我们的建议。

规范

规范
ECMAScript® 2026 语言规范
# sec-do-while-statement

浏览器兼容性

另见