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 July 2015.

do...while 语句创建了一个循环,只要测试条件为 true,该循环就会执行指定语句。执行语句后会对条件进行评估,从而使指定语句至少执行一次。

尝试一下

语法

js
do
  statement
while (condition);
statement

执行至少一次的语句,并在每次条件值为真时重新执行。想在循环中执行多行语句,可使用语句包裹这些语句。

condition

循环中每次都会计算的表达式。如果 condition 值为真statement 会再次执行。当 condition 值为假时,控制权传递到 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);
// 尽管 i === 0,但仍会进入循环,因为开始时没有进行测试

console.log(result);

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

由于语句总是被执行一次,do...while (false) 等同于执行语句本身。这是类 C 语言中常见的习语,它允许你使用 break 来提前跳出分支逻辑。

js
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);
// 剩余代码

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

js
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);
  }
}

或者使用函数:

js
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);
  }
}

使用赋值作为条件

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

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

但是,当你这样做时,就会在可读性上有所取舍。在 while 文档中有一个使用赋值作为条件部分,其中包含了我们的建议。

规范

Specification
ECMAScript Language Specification
# sec-do-while-statement

浏览器兼容性

BCD tables only load in the browser

参见