JavaScript 中可以嵌套的层数有限制吗?
Is there a limit to how many levels you can nest in JavaScript?
假设您有一个非常复杂的算法,需要数十个 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 次循环才能将数字添加到组合数组,然后过滤它们以找到它们相对于第三个数字的总和。
宇宙中有足够的space来存储那么多数据吗?
规格没有限制。由于 memory/stack 溢出,可能 在任何实施中都会有限制...
例如,这很好用:
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);
在编写应该由人类阅读和维护的代码时,没有您应该担心的最大嵌套级别。您可以毫无问题地嵌套数百个循环。
但是,您应该尽可能避免它!在某些时候,有人必须理解您的代码(很可能是您,当您正在调试时!)并且会诅咒您。应该可以将内部循环提取到具有有意义名称的单独函数中。
只是为了启动一个简短的测试,我已经修改为不计算循环次数,而不是看到内存限制......这段代码(请不要使用它,你的机器会讨厌你):
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 个嵌套循环,代码又阻塞了我的浏览器几秒钟(但没有显示其余部分,因为"too many messages per second to the console" 错误)。
在那之后我不太关心更多细节,也没有看到这里更详细描述的好处,但是(在我的项目中)我正在遍历 HTML 很多在布局糟糕的页面中嵌套循环,这些结果超出了我的需要。
TL;DR:内存起着比循环数更大的作用,但我已经超过了 1000 个嵌套循环。请不要使用那么多:)
PS。这是 Edge 中的 运行,对于版本检查我的 post :)
的日期
假设您有一个非常复杂的算法,需要数十个 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 次循环才能将数字添加到组合数组,然后过滤它们以找到它们相对于第三个数字的总和。
宇宙中有足够的space来存储那么多数据吗?
规格没有限制。由于 memory/stack 溢出,可能 在任何实施中都会有限制...
例如,这很好用:
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);
在编写应该由人类阅读和维护的代码时,没有您应该担心的最大嵌套级别。您可以毫无问题地嵌套数百个循环。
但是,您应该尽可能避免它!在某些时候,有人必须理解您的代码(很可能是您,当您正在调试时!)并且会诅咒您。应该可以将内部循环提取到具有有意义名称的单独函数中。
只是为了启动一个简短的测试,我已经修改为不计算循环次数,而不是看到内存限制......这段代码(请不要使用它,你的机器会讨厌你):
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 个嵌套循环,代码又阻塞了我的浏览器几秒钟(但没有显示其余部分,因为"too many messages per second to the console" 错误)。
在那之后我不太关心更多细节,也没有看到这里更详细描述的好处,但是(在我的项目中)我正在遍历 HTML 很多在布局糟糕的页面中嵌套循环,这些结果超出了我的需要。
TL;DR:内存起着比循环数更大的作用,但我已经超过了 1000 个嵌套循环。请不要使用那么多:)
PS。这是 Edge 中的 运行,对于版本检查我的 post :)
的日期