for 循环在算法当中的使用非常广泛, 是学习算法的最重要基础语法之一.
for 循环是一个 在特定条件之下, 重复执行内部逻辑(循环体) 的一个语法逻辑, 可以用如下的语法结构来表示:
1for (初始化; 停止条件; 迭代条件) {2// 循环体3}
迭代条件是循环体执行结束之后, 才会执行的操作. 这是大家在学习 for 循环时, 最容易忽略的一个知识点, 从而导致许多人在工作多年之后, 依然无法得心应手的去处理一些边界条件
例如, 一个案例
i = 0i < 10i++ (每次循环结束后, 变量 i 的值加一)console.log(i)1for (let i = 0; i < 10; i++) {2console.log(i) // 0 1 2 3 4 5 6 7 8 93}
需要特别注意, 由于循环体执行结束之后, 会执行迭代条件, 因此, 在最后一次循环体执行之后, 变量 i 的值继续递增 9 -> 10. 然后在停止条件判断时, i < 10 不满足, 因此循环结束. 面试时, 经常会问, 循环体执行了几次?最终 i 的值是多少?这也是许多人容易忽视的知识点
我们也可以把初始条件写在循环的外面, 例如:
1let i = 023for (; i < 10; i++) {4console.log(i) // 0 1 2 3 4 5 6 7 8 95}
划重点, 如果判断条件变得更加复杂, 我们也可以定义多个初始变量和迭代条件, 例如:
1for (let i = 0, j = 0; i < 10 && j < 10; i++, j++) {2console.log(i, j) // 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 93}
迭代条件可以是任意的表达式, 他通常是在初始值的基础之上, 进行变化. 例如, 递减
1for (let i = 10; i > 0; i--) {2console.log(i); // 从10倒数到13}
当然, 也可以每次迭代都多加一点
1for (let i = 0; i < 10; i += 2) {2console.log(i); // 输出 0, 2, 4, 6, 83}
一个比较常见的用法是遍历数组
1const fruits = ['apple', 'banana', 'orange'];23for (let i = 0; i < fruits.length; i++) {4console.log(fruits[i]);5}
有的时候, 我们可能会有多个终止条件, 我们可以把范围最大的终止条件放到外面, 然后把一些小的终止条件, 放到循环体内部来执行, 通过 break 来终止循环
1for (let i = 0; i < 10; i++) {2if (i === 5) break;3console.log(i); // 输出 0-44}
或者通过 continue 来跳过当前循环:当前的循环体逻辑不执行, 直接进入下一次循环
1for (let i = 0; i < 10; i++) {2if (i % 2 === 0) continue;3console.log(i); // 输出奇数 1,3,5,7,94}
在复杂场景下, 嵌套循环是一个常用的技术手段. 例如, 在最长公共子序列、React 底层的事件循环中, 都使用到了嵌套循环.
for 循环的嵌套循环往往是一个二维的数据结构. 我们可以用图示来表达

1for (let i = 0; i < 5; i++) {2for (let j = 0; j < 5; j++) {3console.log(`${i}-${j}`);4}5}
外层循环是 i, 内层循环是 j. 外层循环每执行一次, 内层循环就会执行一轮. 初学者要稍微花一点时间去感悟一下.
for 循环在算法中的运用非常广泛. 例如, 最简单的线性搜索
从数组中, 找到目标值的索引
01function linearSearch(arr, target) {02for (let i = 0; i < arr.length; i++) {03if (arr[i] === target) {04return i; // 找到目标, 返回索引05}06}07return -1; // 未找到08}0910// 使用示例11const numbers = [4, 2, 7, 1, 9];12console.log(linearSearch(numbers, 7)); // 输出: 2
字符串反转, 也是一个常见的算法题目
输入:hello -> 输出:olleh
核心思路是定义一个索引指针从字符串的末尾往前移动, 并记录每次移动的字符, 最后把这些字符拼接起来
01function reverseString(str) {02let reversed = '';03for (let i = str.length - 1; i >= 0; i--) {04reversed += str[i];05}06return reversed;07}0809// 使用示例10console.log(reverseString('hello')); // 输出: 'olleh'