假设您有这么大的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.
我知道第二个循环为何立即结束,但是为什么第一个循环会导致泄漏?
答案 0 :(得分:2)
在标准中,执行for...in
和for...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)