JavaScript中嵌套的层数是否有限制?

3

假设你有一个非常复杂的算法,需要使用数十个循环。

JavaScript 的循环嵌套深度是否有限制,还是没有限制?

如何最佳实践处理深度嵌套的 for 循环?

我在 MDN 上尝试搜索,但没有找到我想要的信息。

编辑

我的问题是,是否有内置限制。例如,如果你有这样的代码:

If ( a = 1, a < 3, a++) {
    if (b = 1; b < 3; b++) {
        ...
        if (cd = 1; cd < 3; cd++) 

这是否真的可能,或者JS会抛出错误?

编辑:以下是一个理论上的例子,说明为什么需要这样做

你想找出一个数组中是否有任何500个数字相加等于另一个数字。你需要大约500个循环将数字添加到combos数组中,然后过滤它们以相对于第三个数字找到它们的总和。

甚至在宇宙中是否有足够的空间来存储那么多数据?


你需要更具体地说明这个函数。 - marblewraith
你可以尝试使用递归函数。 - Anshuk
1
你可能会遇到堆栈溢出问题。规范没有强制限制,但浏览器有。但是还有像“尾调用优化”和“跳板”这样的技术,可以帮助减少堆栈大小等其他问题。这意味着如果你真的想要的话,你可以有更高层次的递归。编辑:这篇文章解释得很好https://dev59.com/pl8e5IYBdhLWcg3w6d4_ - ste2425
在宇宙中是否有足够的空间来存储那么多数据?是的。一个数组中有500个数字?然后计算所有排列组合?那就是500^2=250k。是的,宇宙中至少有250k的空间 - Tersosauros
3个回答

4

规范中没有限制。由于内存/堆栈溢出,任何实现可能会有限制...

例如,这个可以正常工作:

var s = 0;
var is = new Array(11);

for(is[0] = 0; is[0] < 2; is[0]++) {
  for(is[1] = 0; is[1] < 2; is[1]++) {
    for(is[2] = 0; is[2] < 2; is[2]++) {
      for(is[3] = 0; is[3] < 2; is[3]++) {
        for(is[4] = 0; is[4] < 2; is[4]++) {
          for(is[5] = 0; is[5] < 2; is[5]++) {
            for(is[6] = 0; is[6] < 2; is[6]++) {
              for(is[7] = 0; is[7] < 2; is[7]++) {
                for(is[8] = 0; is[8] < 2; is[8]++) {
                  for(is[9] = 0; is[9] < 2; is[9]++) {
                    for(is[10] = 0; is[10] < 2; is[10]++) {
                      s++;
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

document.write(s);


1

这只是一个简短的测试,我后来对其进行了修改,不再像计算循环次数一样计算内存限制... 这段代码(请不要使用它,你的机器会崩溃):

    function x () {
    function newLoop (index) {
        var y = [];
        console.log("index");
        for (i = index; i < index+1000; i++) {
            y.push(i);
            if(i == index+999) {
                console.log(i);
                newLoop(i);
            }
        }
    }
    newLoop(0);
}
x();

已经在控制台记录了499500次。这可能触发了某个安全开关或内存限制。

这是500个嵌套循环。

在早期使用此代码的轻量级版本进行测试时,我在第一秒钟就达到了999个嵌套循环,并且代码会在另外几秒钟内阻塞我的浏览器(但由于“每秒向控制台发送太多消息”错误而不显示其余部分)。

之后我没有再详细了解更多细节,也没有看到在这里提供更详细的描述的好处,但(在我的项目中)我正在遍历HTML,其中有大量嵌套循环在布局不良的页面中,这些结果远远超出了我的需求。

简而言之:内存扮演着比循环次数更重要的角色,但我已经超过了1000个嵌套循环。但请不要使用那么多:)

附注:这是在Edge中运行的,请检查我的帖子日期:)


它在我的相对较新的笔记本电脑(华为Matebook 2020)上停留在大约140k左右。Visual Studio编译的C++嵌套级别约为100,这似乎是合理的。 - Ali Mert Çakar

0

当你编写人类阅读和维护的代码时,你不必担心最大嵌套级别。你可以嵌套数百个循环而不会出现问题。

然而,尽可能避免嵌套!在某些时候,有人需要理解你的代码(很可能是你自己,在调试时!)并且会诅咒你。应该可以将内部循环提取到具有有意义名称的单独函数中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接