JavaScript 基础
Document
运算符
深入数据和类型
函数进阶
原型、继承
类
浏览器存储
Web API
事件
错误处理
异步编程
网络请求
模块
练习
实例
工具与规范
软件架构模式
设计模式
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)
}
}
结束或跳过循环
break
与 continue
同样可以在 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)
}
练习
- 假如有一个包含着一些数字的数组,求出数组中的最大值和最小值。 $$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} 是质数`)
}
$$
- 实现一个冒泡排序,使得针对任何数组都能从小到大排列。冒泡排序讲解: 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} 次`)
$$