while和do循环
现考虑编写一个程序,输出 0 到 12 之间的所有偶数。其中一种编写方式如下所示:
console.log(0);console.log(2);console.log(4);console.log(6);console.log(8);console.log(10);console.log(12);
该程序确实可以工作,但编程的目的在于减少工作量,而非增加。如果我们需要小于 1000 的偶数,上面的方式是不可行的。我们现在所需的是重复执行某些代码的方法,我们将这种控制流程称为循环。

我们可以使用循环控制流来让程序执行回到之前的某个位置,并根据程序状态循环执行代码。如果我们在循环中使用一个绑定计数,那么就可以按照如下方式编写代码:
let number = 0;while (number <= 12) {console.log(number);number = number + 2;}// → 0// → 2// … etcetera
循环语句以关键字while开头。在关键字while后紧跟一个用括号括起来的表达式,括号后紧跟一条语句,这种形式与if语句类似。只要表达式产生的值转换为布尔值后为true,该循环会持续进入括号后面的语句。
number绑定演示了绑定可以跟踪程序进度的方式。 每次循环重复时,number的值都比以前的值多 2。 在每次重复开始时,将其与数字 12 进行比较来决定程序的工作是否完成。
作为一个实际上有用的例子,现在我们可以编写一个程序来计算并显示2**10(2 的 10 次方)的结果。 我们使用两个绑定:一个用于跟踪我们的结果,一个用来计算我们将这个结果乘以 2 的次数。 该循环测试第二个绑定是否已达到 10,如果不是,则更新这两个绑定。
let result = 1;let counter = 0;while (counter < 10) {result = result * 2;counter = counter + 1;}console.log(result);// → 1024
计数器也可以从1开始并检查<= 10,但是,由于一些在第 4 章中澄清的原因,从 0 开始计数是个好主意。
do循环控制结构类似于while循环。两者之间只有一个区别:do循环至少执行一遍循环体,只有第一次执行完循环体之后才会开始检测循环条件。do循环中将条件检测放在循环体后面,正反映了这一点:
let yourName;do {yourName = prompt("Who are you?");} while (!yourName);console.log(yourName);
这个程序会强制你输入一个名字。 它会一再询问,直到它得到的东西不是空字符串。 !运算符会将值转换为布尔类型再取反,除了""之外的所有字符串都转换为true。 这意味着循环持续进行,直到您提供了非空名称。
