# 循环与迭代

updated at 2020-11-25

# for循环

for ([initialExpression]; [condition]; [incrementExpression])
  statement
1
2

for循环的过程

  1. 如果有初始化表达式 initialExpression,它将被执行。这个表达式通常会初始化一个或多个循环计数器,但语法上是允许一个任意复杂度的表达式的。这个表达式也可以声明变量。
  2. 计算 condition 表达式的值。如果 condition 的值是 true,循环中的语句会被执行。如果 condition 的值是 false,for 循环终止。如果 condition 表达式整个都被省略掉了,condition的值会被认为是true。
  3. 循环中的 statement 被执行。如果需要执行多条语句,可以使用块({ ... })来包裹这些语句。 如果有更新表达式 incrementExpression,执行更新表达式。
  4. 回到步骤 2。
const str = 'hello'
for (var i = str.length; i--;) {
  console.log(i) // 4, 3, 2, 1, 0
}
1
2
3
4

这里的循环别被i--误会了,其实它是condition,这里省略的是incrementExpression,巧妙的是i--到0的时候条件就是flase了,所以循环结束。

# do...while

do
  statement
while (condition);
1
2
3

如果 condition 为真(true),statement 将再次执行。 在每个执行的结尾会进行条件的检查。当 condition 为假(false),执行会停止并且把控制权交回给 do...while 后面的语句

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

# while 语句

while (condition)
  statement
1
2

与上面的do...while相反,while是在执行语句之前判断条件

let i = 5
while (i>0) {
  console.log(i)  // 5, 4, 3, 2, 1
  i--
}
1
2
3
4
5

# label 语句

label :
   statement
1
2

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

let num = 0
for (let i = 0; i < 10; i++) {
  for (let j = 0; j < 10; j++) {
    if (i == 5 && j == 5) {
      break
    }
    num++
  }
}
console.log(num)  // 95
// 
let num = 0
for (let i = 0; i < 10; i++) {
  for (let j = 0; j < 10; j++) {
    if (i == 5 && j == 5) {
      continue
    }
    num++
  }
}
console.log(num)  // 99
// 
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
    }
    num++
  }
}
console.log(num) // 55
//
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45

# break 语句

break [label];
1
  • 当你使用不带 label 的 break 时, 它会立即终止当前所在的 whiledo-whilefor,或者 switch 并把控制权交回这些结构后面的语句。
  • 当你使用带 label 的 break 时,它会终止指定的带标记(label)的语句。

# continue 语句

continue [label];
1
  • 当你使用不带 label 的 continue 时, 它终止当前 whiledo-while,或者 for 语句到结尾的这次的循环并且继续执行下一次循环。
  • 当你使用带 label 的 continue 时, 它会应用被 label 标识的循环语句。

# for...in 语句

# for...of 语句

for...infor...of 可以看另一篇文章for_in_and_for_of.md-----[文件地址](/Users/zengxianghui/Library/Mobile Documents/iCloud~com~coderforart~iOS~MWeb/Documents/note/frontend/for_in_and_for_of.md)

# 参考

  1. MDN-循环与迭代
  2. Is using labels in JavaScript bad practice?
更新于: 3/8/2021, 2:04:53 AM