1. 循环:在循环条件满足的情况下,重复的运行循环体
  2. 循环体:在循环条件成立后执行的一段代码,可以是一条语句,也可以是多条语句
  3. 死循环:循环条件永远满足,永远无法退出循环
  4. JS 中的循环语句:
    1. for
    2. while
    3. do-while
  5. break 跳出循环
  6. continue 停止当前循环体,继续下一次循环

循环语句用于重复执行某个操作,它有多种形式。

while 循环

while语句包括一个循环条件和一段代码块,只要条件为真,就不断循环执行代码块。

  1. while (条件)
  2. 语句;
  3. // 或者
  4. while (条件) 语句;

js 循环语句 - 图1 while语句的循环条件是一个表达式,必须放在圆括号中。代码块部分,如果只有一条语句,可以省略大括号,否则就必须加上大括号。

  1. while (条件) {
  2. 语句;
  3. }

下面是while语句的一个例子。

  1. var i = 0;
  2. while (i < 100) {
  3. console.log('i 当前为:' + i);
  4. i = i + 1;
  5. }

上面的代码将循环100次,直到i等于100为止。

下面的例子是一个无限循环,因为循环条件总是为真。

  1. while (true) {
  2. console.log('Hello, world');
  3. }

for 循环

for语句是循环命令的另一种形式,可以指定循环的起点、终点和终止条件。它的格式如下。

  1. for (初始化表达式; 条件; 递增表达式)
  2. 语句
  3. // 或者
  4. for (初始化表达式; 条件; 递增表达式) {
  5. 语句
  6. }

js 循环语句 - 图2 for语句后面的括号里面,有三个表达式。

  • 初始化表达式(initialize):确定循环变量的初始值,只在循环开始时执行一次。
  • 条件表达式(test):每轮循环开始时,都要执行这个条件表达式,只有值为真,才继续进行循环。
  • 递增表达式(increment):每轮循环的最后一个操作,通常用来递增循环变量。

下面是一个例子。

  1. var x = 3;
  2. for (var i = 0; i < x; i++) {
  3. console.log(i);
  4. }
  5. // 0
  6. // 1
  7. // 2

上面代码中,初始化表达式是var i = 0,即初始化一个变量i;测试表达式是i < x,即只要i小于x,就会执行循环;递增表达式是i++,即每次循环结束后,i增大1。

所有for循环,都可以改写成while循环。上面的例子改为while循环,代码如下。

  1. var x = 3;
  2. var i = 0;
  3. while (i < x) {
  4. console.log(i);
  5. i++;
  6. }

for语句的三个部分(initialize、test、increment),可以省略任何一个,也可以全部省略。

  1. for ( ; ; ){
  2. console.log('Hello World');
  3. }

上面代码省略了for语句表达式的三个部分,结果就导致了一个无限循环。

do…while 循环

do...while循环与while循环类似,唯一的区别就是先运行一次循环体,然后判断循环条件。

  1. do
  2. 语句
  3. while (条件);
  4. // 或者
  5. do {
  6. 语句
  7. } while (条件);

js 循环语句 - 图3 不管条件是否为真,do...while循环至少运行一次,这是这种结构最大的特点。另外,while语句后面的分号注意不要省略。

下面是一个例子。

  1. var x = 3;
  2. var i = 0;
  3. do {
  4. console.log(i);
  5. i++;
  6. } while(i < x);

break 语句和 continue 语句

break语句和continue语句都具有跳转作用,可以让代码不按既有的顺序执行。

break语句用于跳出代码块或循环。

  1. var i = 0;
  2. while(i < 100) {
  3. console.log('i 当前为:' + i);
  4. i++;
  5. if (i === 10) break;
  6. }

上面代码只会执行10次循环,一旦i等于10,就会跳出循环。

for循环也可以使用break语句跳出循环。

  1. for (var i = 0; i < 5; i++) {
  2. console.log(i);
  3. if (i === 3)
  4. break;
  5. }
  6. // 0
  7. // 1
  8. // 2
  9. // 3

上面代码执行到i等于3,就会跳出循环。

continue语句用于立即终止本轮循环,返回循环结构的头部,开始下一轮循环。

  1. var i = 0;
  2. while (i < 100){
  3. i++;
  4. if (i % 2 === 0) continue;
  5. console.log('i 当前为:' + i);
  6. }

上面代码只有在i为奇数时,才会输出i的值。如果i为偶数,则直接进入下一轮循环。

如果存在多重循环,不带参数的break语句和continue语句都只针对最内层循环。

标签(label)

JavaScript 语言允许,语句的前面有标签(label),相当于定位符,用于跳转到程序的任意位置,标签的格式如下。

  1. label:
  2. 语句

标签可以是任意的标识符,但不能是保留字,语句部分可以是任意语句。

标签通常与**break**语句和**continue**语句配合使用,跳出特定的循环

  1. top:
  2. for (var i = 0; i < 3; i++){
  3. for (var j = 0; j < 3; j++){
  4. if (i === 1 && j === 1) break top;
  5. console.log('i=' + i + ', j=' + j);
  6. }
  7. }
  8. // i=0, j=0
  9. // i=0, j=1
  10. // i=0, j=2
  11. // i=1, j=0

上面代码为一个双重循环区块,break命令后面加上了top标签(注意,top不用加引号),满足条件时,直接跳出双层循环。如果break语句后面不使用标签,则只能跳出内层循环,进入下一次的外层循环。

标签也可以用于跳出代码块。

  1. foo: {
  2. console.log(1);
  3. break foo;
  4. console.log('本行不会输出');
  5. }
  6. console.log(2);
  7. // 1
  8. // 2

上面代码执行到break foo,就会跳出区块。

continue语句也可以与标签配合使用。

  1. top:
  2. for (var i = 0; i < 3; i++){
  3. for (var j = 0; j < 3; j++){
  4. if (i === 1 && j === 1) continue top;
  5. console.log('i=' + i + ', j=' + j);
  6. }
  7. }
  8. // i=0, j=0
  9. // i=0, j=1
  10. // i=0, j=2
  11. // i=1, j=0
  12. // i=2, j=0
  13. // i=2, j=1
  14. // i=2, j=2

上面代码中,continue命令后面有一个标签名,满足条件时,会跳过当前循环,直接进入下一轮外层循环。如果continue语句后面不使用标签,则只能进入下一轮的内层循环。

你不能将一个标签放置在一个独立的语句块中,然后试图在这个标签块之外的代码中使用 **break****continue** 语句跳转到它

image.png

在上述代码例子中,试图在 for 循环内部使用 break 语句跳转到 for 循环之外的 top 标签,这是不被允许的。

标签需要被放置在一个封闭的语句块中,例如 **while****do while****for** 或者 **switch** 语句,或者一个更大的封闭的块(使用大括号 **{}** 定义的块)中。当在这些块内部使用 breakcontinue 语句并指定一个标签时,控制会被转移到标签所在的块之后的代码。

问:如何使用 break 跳出多层循环?

  1. top: {
  2. for (var i = 0; i < 3; i++) {
  3. for (var j = 0; j < 3; j++) {
  4. if (i === 1 && j === 1) break top;
  5. console.log('i=' + i + ', j=' + j);
  6. }
  7. }
  8. }
  9. // i=0, j=0
  10. // i=0, j=1
  11. // i=0, j=2
  12. // i=1, j=0