六维教程

JavaScript while 与 do-while 循环

程序经常要做重复的事情。比如把 1 加到 100,写一百行加法不现实。循环就是让一段代码反复执行的结构。这篇讲 while 和 do-while 两个循环,下一篇讲最常见的 for 循环。

判断一个条件是否成立靠的是布尔值,循环和上一篇的 if 都依赖条件判断,只不过 if 只判断一次,循环会反复判断直到条件不成立。

while 循环

while 的流程是先判断条件,为 true 就执行循环体,执行完再判断,直到条件为 false 才停下来。

while (条件) {
  // 反复执行的代码
}

一个循环要能正常工作需要三个要素,初始值、循环条件、条件的更新。以 1 加到 100 为例

let sum = 0;        // 存总和
let i = 1;          // 初始值,从 1 开始加

while (i <= 100) {  // 循环条件,i 不超过 100 就继续
  sum = sum + i;    // 把 i 累加进 sum
  i = i + 1;        // 更新,i 自增 1
}

console.log(sum);   // 输出 5050

i 从 1 开始,每轮加进 sum 后自增 1,加到 101 时条件 101 <= 100 为 false,循环结束。sum 和 i 都需要重新赋值,所以用 let 声明。

条件更新非常重要。如果漏掉 i = i + 1,i 永远是 1,条件永远为 true,循环永远不会结束。

无限循环

条件永远为 true 且循环变量不更新,循环就停不下来,这叫无限循环。浏览器里会一直卡住,页面失去响应,只能关掉页面。

// 危险示例,千万不要运行
while (true) {
  console.log('停不下来');
}

写循环时想清楚三要素,特别是更新语句,确认每次循环条件都会往 false 靠近。不确定时可以先用小数字测试,或者配合下面的 break 控制退出。

do-while 循环

do-while 和 while 只有一个区别。它先执行一次循环体,再判断条件。所以无论条件是否成立,循环体至少执行一次。

do {
  // 先执行一次的代码
} while (条件);

对比看差别。同样的代码 while 可能一次都不执行,do-while 必定执行一次。

let a = 10;
while (a < 5) {
  console.log('while 执行了');
}
// 条件为 false,一次都不执行

let b = 10;
do {
  console.log('do-while 执行了');
} while (b < 5);
// 先执行一次再判断,所以输出一次

do-while 适合至少要执行一次的场景。比如让用户输入数字,无论第一次输入什么都要先读一次,判断不对再继续读。

// 模拟一次输入,真实场景中从输入框读取
let input = '';

do {
  input = 'hello';        // 用户输入了内容
  console.log('读到内容 ' + input);
} while (input === '');   // 输入为空就继续读

这里先执行读取再判断。模拟输入不为空,判断条件为 false,循环只执行一次就结束。如果用户没输入,条件成立,会继续循环直到读到内容。

break 提前跳出

循环里可以用 break 立刻结束整个循环,后面的循环体不再执行。适合找到目标就收工的场景。比如在 1 到 100 里找第一个能被 7 整除的数。

let n = 1;

while (true) {
  if (n % 7 === 0) {
    console.log('找到了 ' + n); // 输出 找到了 7
    break;                      // 跳出循环
  }
  n = n + 1;
}

这个例子故意把条件写成 true,靠循环体内的 break 控制退出。while(true) 加 break 是常见的写法,退出时机由内部判断决定,也不容易漏掉更新语句。

小结

  • while 先判断后执行,条件为 false 时一次都不执行,循环三要素是初始值、条件、更新。
  • do-while 先执行后判断,至少执行一次,适合必须执行一次的输入验证场景。
  • 忘记更新循环变量会产生无限循环,卡死页面,务必确认条件最终会变为 false。
  • break 可以立即结束整个循环,用于提前找到目标就退出的场景。
上一篇
JavaScript switch 语句
下一篇
JavaScript for 循环