JavaScript 循环:拥有最佳性能的最佳实践( 三 )


循环内部改动循环变量在循环内部更改循环变量可能引发预期不到的效果或错误 。此做法通常并不合适 。理想的方案是使用一个单独的变量来存储你希望更改的值 。
例如,如下循环:
for (let i = 0; i < 10; i++) {console.log(i); i++; // 在循环内修改 i }上述代码中,i 在循环中被修改,可能造成不在期望范围的结果 。相对地,你应该像下面这样使用一个单独的变量来存储你想要修改的值:
for (let i = 0; i < 10; i++) {console.log(i);let modifiedValue = https://www.isolves.com/it/cxkf/yy/js/2023-09-13/i + 1; // 使用一个单独的变量来修改 i }忽略大括号的使用虽然你可以在编写循环时省略大括号,但这通常并不推荐 。缺少大括号可能复杂化代码的阅读和理解,甚至可能引发错误或不预期的效果 。
例如,如下循环:
for (let i = 0; i < 10; i++)console.log(i);由于此循环未使用大括号,可能使代码的阅读和理解变得困难,因此即使是单行语句,也最好始终使用大括号:
for (let i = 0; i < 10; i++) {console.log(i); }避免无限循环无限循环指的是永不终止的循环 。当退出条件设置不当,或永不满足时,就可能出现这种情况 。无限循环不仅可能导致程序崩溃或挂起,还可能非常难以调试 。
例如:
观察下面的循环,它没有增加变量值,也未检查是否超过某个阈值:
let count = 0; while (count < 10) {console.log(count); }由于 count 变量未曾增加,此代码将触发无限循环 。
因此,你应该时刻警惕无限循环的可能性 。为了避免无限循环,请确保设置了正确的退出条件,并对代码进行了充分测试 。
“越界”错误在编程中,越界错误是一种常见问题,发生在使用不正确的比较运算符或未充分考虑循环变量初始值的情况下 。这些错误可能导致程序结果不准确,甚至在某些情况下会触发程序崩溃 。
例如,假设你有一个包含 10 个元素的数组,你计划遍历它,并对每个元素执行特定操作 。
正确的循环编写如下:
const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; for (let i = 0; i < arr.length; i++) {console.log(arr[i]); }该代码将遍历数组的全部 10 个元素,并将各个元素的值输出到控制台 。但是,如果你误用了比较运算符,将 i< arr.length写成 i<=arr.length会怎样呢?
const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; for (let i = 0; i <= arr.length; i++) {console.log(arr[i]); }这段代码将触发一个越界错误,因为当i等于 arr.length时,将尝试访问一个不存在的元素 。循环将执行共计11 次而非 10 次,最后一次迭代将抛出错误,因为 arr[10] 的值为 undefined 。为了防止越界错误的发生,你应仔细检查循环条件、确保使用正确的比较运算符,并充分考虑循环变量的初始值 。通过避免这些常见错误,你能够确保循环的准确执行,从而降低程序中的错误或崩溃风险 。同时,在执行代码之前,仔细审查潜在错误始终是明智的做法 。
在适当场合,选择递归在程序设计中,递归经常被视为一种优雅的解决方案 。
递归特别适用于处理层级数量未知或不固定的分层数据结构,如树形结构或嵌套数组 。
与传统的嵌套循环相比,当处理具有未知深度的结构时,递归能使代码更整洁、易读 。
警告:使用递归时需谨慎,确保递归有明确的终止条件,避免发生无限递归和栈溢出错误 。
例如,考虑以下情景:
假设你拥有一个包含嵌套数字的数组结构,你的任务是找到数组中所有数字(包括嵌套的数字)的总和 。在此情景下,递归可以被优雅地应用 。下面是一个通过递归来求嵌套数组总和的示例代码:
const nestedArray = [[1, 2, [3]], 4]; function sumArray(arr) {let sum = 0;for (let i = 0; i < arr.length; i++) {if (Array.isArray(arr[i])) {// 如果当前元素是数组,则递归处理sum += sumArray(arr[i]);} else {// 如果当前元素是数字,则加入总和sum += arr[i];}}return sum; } console.log(sumArray(nestedArray)); // 输出:10此代码利用递归深入遍历嵌套数组 nestedArray 。它可以计算所有数字的总和,而不受嵌套深度的限制 。
递归函数允许自身反复调用,直到达到最底层的嵌套结构,并返回一个可用于计算最终总和的值 。
通过检查每个元素是否为数组,该函数递归处理数组元素,直到达到最深的嵌套层级,即数字 。
然后,函数将该数字返回到上一递归层 。这样便于计算当前层级所有元素的总和 。


推荐阅读