创建时间: 2025-04-11最后更新: 2025-12-22作者: yangbo(96862973d)

for 循环在算法当中的使用非常广泛, 是学习算法的最重要基础语法之一.

1、基础语法

for 循环是一个 在特定条件之下, 重复执行内部逻辑(循环体) 的一个语法逻辑, 可以用如下的语法结构来表示:

code.ts
1
for (初始化; 停止条件; 迭代条件) {
2
// 循环体
3
}
  • 初始化的值是当前值, 循环体执行时, 会对当前值进行操作
  • 停止条件是一个判断条件, 判断当前值是否满足条件, 满足则停止循环
  • 迭代条件是每次循环结束后, 对当前值进行的操作
NOTE

迭代条件是循环体执行结束之后, 才会执行的操作. 这是大家在学习 for 循环时, 最容易忽略的一个知识点, 从而导致许多人在工作多年之后, 依然无法得心应手的去处理一些边界条件

例如, 一个案例

  • 初始化时设定一个变量 i = 0
  • 停止条件是 i < 10
  • 迭代条件是 i++ (每次循环结束后, 变量 i 的值加一)
  • 循环体是 console.log(i)
code.ts
1
for (let i = 0; i < 10; i++) {
2
console.log(i) // 0 1 2 3 4 5 6 7 8 9
3
}
NOTE

需要特别注意, 由于循环体执行结束之后, 会执行迭代条件, 因此, 在最后一次循环体执行之后, 变量 i 的值继续递增 9 -> 10. 然后在停止条件判断时, i < 10 不满足, 因此循环结束. 面试时, 经常会问, 循环体执行了几次?最终 i 的值是多少?这也是许多人容易忽视的知识点

我们也可以把初始条件写在循环的外面, 例如:

code.ts
1
let i = 0
2
3
for (; i < 10; i++) {
4
console.log(i) // 0 1 2 3 4 5 6 7 8 9
5
}

划重点, 如果判断条件变得更加复杂, 我们也可以定义多个初始变量和迭代条件, 例如:

code.ts
1
for (let i = 0, j = 0; i < 10 && j < 10; i++, j++) {
2
console.log(i, j) // 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9
3
}

2、变体

迭代条件可以是任意的表达式, 他通常是在初始值的基础之上, 进行变化. 例如, 递减

code.ts
1
for (let i = 10; i > 0; i--) {
2
console.log(i); // 从10倒数到1
3
}

当然, 也可以每次迭代都多加一点

code.ts
1
for (let i = 0; i < 10; i += 2) {
2
console.log(i); // 输出 0, 2, 4, 6, 8
3
}

一个比较常见的用法是遍历数组

code.ts
1
const fruits = ['apple', 'banana', 'orange'];
2
3
for (let i = 0; i < fruits.length; i++) {
4
console.log(fruits[i]);
5
}

有的时候, 我们可能会有多个终止条件, 我们可以把范围最大的终止条件放到外面, 然后把一些小的终止条件, 放到循环体内部来执行, 通过 break 来终止循环

code.ts
1
for (let i = 0; i < 10; i++) {
2
if (i === 5) break;
3
console.log(i); // 输出 0-4
4
}

或者通过 continue 来跳过当前循环:当前的循环体逻辑不执行, 直接进入下一次循环

code.ts
1
for (let i = 0; i < 10; i++) {
2
if (i % 2 === 0) continue;
3
console.log(i); // 输出奇数 1,3,5,7,9
4
}

3、嵌套循环

在复杂场景下, 嵌套循环是一个常用的技术手段. 例如, 在最长公共子序列、React 底层的事件循环中, 都使用到了嵌套循环.

for 循环的嵌套循环往往是一个二维的数据结构. 我们可以用图示来表达

code.ts
1
for (let i = 0; i < 5; i++) {
2
for (let j = 0; j < 5; j++) {
3
console.log(`${i}-${j}`);
4
}
5
}

外层循环是 i, 内层循环是 j. 外层循环每执行一次, 内层循环就会执行一轮. 初学者要稍微花一点时间去感悟一下.

4、在算法中的运用

for 循环在算法中的运用非常广泛. 例如, 最简单的线性搜索

从数组中, 找到目标值的索引

code.ts
01
function linearSearch(arr, target) {
02
for (let i = 0; i < arr.length; i++) {
03
if (arr[i] === target) {
04
return i; // 找到目标, 返回索引
05
}
06
}
07
return -1; // 未找到
08
}
09
10
// 使用示例
11
const numbers = [4, 2, 7, 1, 9];
12
console.log(linearSearch(numbers, 7)); // 输出: 2

字符串反转, 也是一个常见的算法题目

输入:hello -> 输出:olleh

核心思路是定义一个索引指针从字符串的末尾往前移动, 并记录每次移动的字符, 最后把这些字符拼接起来

code.ts
01
function reverseString(str) {
02
let reversed = '';
03
for (let i = str.length - 1; i >= 0; i--) {
04
reversed += str[i];
05
}
06
return reversed;
07
}
08
09
// 使用示例
10
console.log(reverseString('hello')); // 输出: 'olleh'
专栏首页
到顶
专栏目录