您可以在JavaScript中嵌套多少级别?

时间:2016-02-05 07:19:35

标签: javascript for-loop nested-loops limits cyclomatic-complexity

假设你有这个非常复杂的算法,需要几十个for循环。

JavaScript是否对嵌套深度循环有限制,或者没有限制?

深层嵌套for循环的最佳做法是什么?

我尝试在MDN上搜索但无法找到我要找的内容

修改

我正在查看是否有内置限制。例如,如果你有这样的东西

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

这实际上是可行的还是JS会抛出错误

编辑:这是您何时可能需要此

的理论示例

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

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

3 个答案:

答案 0 :(得分:3)

规格没有限制。由于内存/堆栈溢出,可能在任何实现中都是一个限制......

例如,这很好用:

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 :(得分: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个嵌套循环,代码会使我的浏览器再次堵塞几秒钟(但由于&#34;每秒到控制台的消息太多&#34;错误)。

在此之后我没有太多关心更多细节,也没有看到更详细描述的好处,但是(在我的项目中)我通过大量嵌套循环遍历HTML在布置得很糟糕的页面中,这些结果超出了我的需求。

TL; DR:内存比循环次数起着更大的作用,但我已经超过了1000个嵌套循环。请尽量不要使用那么多:)

PS。这是在Edge中运行的,因为版本检查我的帖子的日期:)

答案 2 :(得分:0)

当您编写人类应该阅读和维护的代码时,您不必担心最大嵌套级别。你可以毫无问题地嵌套数百个循环。

但是,你应该尽可能避免它!在某些时候,有人必须了解你的代码(很可能是你,当你在调试时!)并且会诅咒你。应该可以将内部循环提取到具有有意义名称的单独函数中。