For ... in循环导致潜在的内存不足崩溃

时间:2018-07-06 03:41:44

标签: javascript out-of-memory

假设您有这么大的array误区。

var arr = new Int32Array(99999999);

这两个for循环执行不同的操作。这会暂停很长一段时间,并最终返回潜在的内存不足崩溃:

for (var i in arr) {console.log("done"); break;} 
// --> Paused before potential out of memory crash.

这一刻立即结束:

for (var i = 0; i < arr.length; i++) {console.log("done"); break; } 
// --> Finishes immediately.

我知道第二个循环为何立即结束,但是为什么第一个循环会导致泄漏?

2 个答案:

答案 0 :(得分:2)

在标准中,执行for...infor...of语句包括从对象获取BoundNames的步骤。

请参阅https://www.ecma-international.org/ecma-262/6.0/#sec-for-in-and-for-of-statements

这里是简短的内容:

  

BoundNames:返回一个新列表,其中包含Identifier的StringValue。

这意味着,如果要迭代大型数组,则引擎必须获取大型List,其中包含数组的所有索引和其他属性,然后才能进行实际的迭代。如果List太大,则会看到内存崩溃。

另一方面,在使用基于索引的List循环时,它不包括获取for步骤。

答案 1 :(得分:1)

可能是因为for...in不保证以任何特定顺序返回索引

根据mdn

  

for ... in不应用于遍历索引所在的数组   顺序很重要。