For ... in loop, что может привести к сбою памяти - PullRequest
0 голосов
/ 06 июля 2018

Допустим, у вас есть этот большой 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-й цикл заканчивается мгновенно, но почему первый цикл вызывает утечку?

Ответы [ 2 ]

0 голосов
/ 06 июля 2018

В стандарте выполнение операторов for...in и for...of включает в себя шаг, который получает BoundNames от объекта.

См. https://www.ecma -international.org / ecma-262 / 6.0 / # sec-in-and-for-of-Statement .

Вот краткое изложение:

BoundNames: вернуть новый список, содержащий StringValue идентификатора.

Это означает, что если вы выполняете итерацию большого массива, механизм должен получить большой List, который содержит все индексы и другие атрибуты массива, прежде чем произойдет фактическая итерация. Если List слишком велик, вы видите сбой памяти.

А с другой стороны, он не включает шаг получения List при использовании основанного на индексе цикла for.

0 голосов
/ 06 июля 2018

Это может быть потому, что for...in не гарантирует возврат индексов в каком-либо конкретном порядке

Согласно МДН

for ... in не должен использоваться для перебора массива, где индекс порядок важен.

...