# 迭代和循环

# for 语句

一个 for 循环会一直重复执行,直到指定的循环条件为 false

for(let i = 0; i < 5 ; i++){
  console.log(i)  // 0,1,2,3,4,
}
1
2
3

# for...in 语句

for...in 语句循环一个指定的变量来循环一个对象所有可枚举的属性。JavaScript 会为每一个不同的属性执行指定的语句。

const obj = {
  a: 1,
  b: 2,
  c: 3
}
for(key in obj) {
  console.log(key) // a,b,c
}

1
2
3
4
5
6
7
8
9

# for...of 语句

for...of 语句在可迭代对象(包括ArrayMapSetarguments 等等)上创建了一个循环,对值的每一个独特属性调用一次迭代。

let arr = [3, 5, 7];
arr.foo = "hello";

for (let i in arr) {
   console.log(i); // 输出 "0", "1", "2", "foo"
}

for (let i of arr) {
   console.log(i); // 输出 "3", "5", "7"
}

// 注意 for...of 的输出没有出现 "hello"
1
2
3
4
5
6
7
8
9
10
11
12

# do...while 语句

do...while 语句一直重复直到指定的条件求值得到假值(false)

let i = 0
do {
  i++
  console.log(i) // 1,2,3,4,5
} while (i < 5)
1
2
3
4
5

# while 语句

一个 while 语句只要指定的条件求值为真(true)就会一直执行它的语句块

let n = 0;
let x = 0;
while (n < 3) {
  n++;
  x += n;
  console.log("n->",n,"x->",x)
  // n-> 1 x-> 1
  // n-> 2 x-> 3
  // n-> 3 x-> 6
}
1
2
3
4
5
6
7
8
9
10

# break 语句

使用 break 语句来终止循环,switch, 或者是链接到 label 语句。

  • 当你使用不带 label 的 break 时, 它会立即终止当前所在的 while,do-while,for,或者 switch 并把控制权交回这些结构后面的语句。
  • 当你使用带 label 的 break 时,它会终止指定的带标记(label)的语句。
for (let i = 0; i < 5; i++) {
  if (i === 3) {
    break;
  }
  console.log(i) // 0,1,2
}
1
2
3
4
5
6

# continue 语句

continue 语句可以用来继续执行(跳过代码块的剩余部分并进入下一循环)一个 whiledo-whilefor,或者 label 语句。

  • 当你使用不带 label 的 continue 时, 它终止当前 whiledo-while,或者 for 语句到结尾的这次的循环并且继续执行下一次循环。
  • 当你使用带 label 的 continue 时, 它会应用被 label 标识的循环语句。
var i = 0;
var n = 0;
while (i < 5) {
  i++;
  if (i == 3) {
    continue;
  }
  n += i;
  console.log(n);  // 1,3,7,12
}
1
2
3
4
5
6
7
8
9
10

# label 语句

一个 label 提供了一个让你在程序中其他位置引用它的标识符。例如,你可以用 label 标识一个循环, 然后使用 break 或者 continue 来指出程序是否该停止循环还是继续循环。

未添加 Label:

let num = 0;
for (let i = 0 ; i < 10 ; i++) {   // i 循环
  for (let j = 0 ; j < 10 ; j++) { // j 循环
    if( i == 5 && j == 5 ) {
       break; // i = 5,j = 5 时,会跳出 j 循环
    } // 但 i 循环会继续执行,等于跳出之后又继续执行更多次 j 循环
    num++;
  }
}

console.log(num); // 输出 95

1
2
3
4
5
6
7
8
9
10
11
12

添加 Label 后:

// break Label
let num = 0;
outPoint:
for (let i = 0 ; i < 10 ; i++){
  for (let j = 0 ; j < 10 ; j++){
    if( i == 5 && j == 5 ){
      break outPoint; // 在 i = 5,j = 5 时,跳出所有循环,
                      // 返回到整个 outPoint 下方,继续执行
    }
    num++;
  }
}
console.log(num); // 输出 55


// continue Label
let num = 0;
outPoint:
for(let i = 0; i < 10; i++) {
  for(let j = 0; j < 10; j++) {
    if(i == 5 && j == 5) {
      continue outPoint;
    }
    num++;
  }
}
console.log(num);  // 95
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27