for 语句

for 循环同样能实现一个循环,相对 while 循环略微复杂,灵活性也更高。

语法如下:

for (begin; condition; step) {
    // code
}
  • begin:开始时执行。
  • condition:每轮循环前判断, true 则执行代码, false 结束循环。
  • step:每轮循环后执行。

下面来看一个简单的例子。

$$jsdemo$$
$$edit$$
for (let i = 0; i < 3; i++) {
    alert(i)
}
  • 在开始时赋值变量 i = 0。
  • 每轮循环前判断 i 是否小于 3,如果成立执行 alert(i),否则结束循环。
  • 每轮循环结束执行 i++。

以上代码可以用我们已经学过的 while 循环来改写。

$$jsdemo$$
$$edit$$
let i = 0
while (i < 3) {
    console.log(i)
    i++
}

绝大部分 while 都有控制变量定义(let i = 0)、条件判断(i < 3)、控制变量改变(i++)这三部分。因此 for 循环的表达式就是将这三部分组合到了一行代码中, for (let i = 0; i < 3; i++)

实例

以下代码实现了打印从 1 至 10 之间的偶数。

$$jsdemo$$
$$edit$$
for (let i = 1; i <= 10; i++) {
    if (i % 2 == 0) {
        console.log(i)
    }
}

结束或跳过循环

breakcontinue 同样可以在 for 循环内部中起作用。

$$jsdemo$$
$$edit$$
for (let i = 0; i < 10; i++) {
    if (i == 3) {
        // 当 i 等于 3 时跳过此轮循环
        continue
    } else if (i == 6) {
        // 当 i 等于 6 时结束循环
        break
    }
    console.log(i)
}

省略语句段

for 循环中的语句段是可以被省略的。

$$jsdemo$$
$$edit$$
let i = 0 
// 省略 begin 代码段
for (; i < 5; i++) {
    console.log(i)
}
$$jsdemo$$
$$edit$$
let i = 0
// 省略 begin 代码段
for (; i < 5;) {
    console.log(i)
    i++
}

当然也可以将 for 循环省略成 for(;;){...} ,它与 while(true) 是等价的。

for in 语句

for in 语句可以作用于一个数组,循环数组长度的次数,每轮循环都会得到一个下标,语法如下:

for (let index in array) {
    // code
}
  • index:每轮循环的下标。
  • array:循环的数组。

以下是一个小例子:

$$jsdemo$$
$$edit$$
let names = ["鸣人", "柯南", "路飞"]
for (let i in names) {
    console.log(i) // 打印下标
    console.log(names[i]) // 打印数组中的元素
}

for of 语句

for of 语句与 for in 类似,同样是作用于数组,不过每轮得到的直接就是列表项,语法如下:

for (let item of array) {
    // code
}
  • item:每轮循环的列表项。
  • array:循环的数组。

以下是一个小例子:

$$jsdemo$$
$$edit$$
let names = ["鸣人", "柯南", "路飞"]
for (let name of names) {
    console.log(name)
}

练习

  1. 假如有一个包含着一些数字的数组,求出数组中的最大值和最小值。 $$answer
$$jsdemo$$
$$edit$$
let numbers = [20, 1, 7, 3, 40, 5]

let min = numbers[0]
let max = numbers[0]

for (let n of numbers) {
    if (n < min) {
        min = n
    }
    if (n > max) {
        max = n
    }
}

alert(`min: ${min}`)
alert(`max: ${max}`)

$$ 2. 用 for 循环打印出 a、b(由用户输入)之间的所有质数。 $$answer

$$jsdemo$$
$$edit$$
let a = Number(prompt("请输入 a"))
let b = Number(prompt("请输入 b"))

let min = a < b ? a : b
let max = a > b ? a : b

for (let i = min; i <= max; i++) {
    // 先假设它是一个质数
    let isPrime = true

    for (let j = 2; j < i; j++) {
        if (i % j == 0) {
            isPrime = false
            break
        }
    }

    if (isPrime) console.log(`${i} 是质数`)
}

$$

  1. 实现一个冒泡排序,使得针对任何数组都能从小到大排列。冒泡排序讲解: youtube 视频b站视频。 $$answer
$$jsdemo$$
$$edit$$
let numbers = [5, 7, 1, 3, 2]

let counter = 0

for (let i = 0; i < numbers.length - 1; i++) {
    // 此轮循环是否发生了交换
    let isChange = false
    for (let n = 0; n < numbers.length - i - 1; n++) {
        counter++
        if (numbers[n] > numbers[n + 1]) {
            isChange = true

            // 如果当前的数大于下一个数
            // 那么两者交换一下位置
            let temp = numbers[n]

            numbers[n] = numbers[n + 1]
            numbers[n + 1] = temp
        }
    }

    if (isChange == false) {
        // 如果没发生交换,结束循环
        break
    }
}

console.log(numbers)
console.log(`总共对比了 ${counter} 次`)

$$