Пишу, по большей части, про историю, свою жизнь и немного про программирование.

Побочный эффект оператора «delete» в JavaScript

Как говорится «век живи, век учись, дураком помрёшь»:

Объяснение (по крайней мере для Хрома) очень простое: когда вы делаете delete testedObject[i].obj, V8 нормализует объект testedObject[i] — трансформирует его из быстрого компактного представления в медленное и раздутое представление на основе словаря, который еще и выделяется с запасом по размеру. При этом V8 не замечает, что после удаления в словаре будет пусто — и словарь (800 байтов) остается болтаться в воздухе. И так для каждого из ваших объектов.

Из коментария к статье на «Хабре», которая описывает странный эффект — при использовании оператора delete что-то продолжает занимать память.

2 комментария
Глеб Арестов (http://arestov.me/) 2012

Я правильно понимаю что тут написано:
«когда вы делаете
var cur = testedObject[i];
delete cur.obj
V8 нормализует объект cur — трансформирует его из быстрого компактного представления в медленное и раздутое представление на основе словаря. При этом V8 не замечает, что после удаления в словаре будет пусто — и словарь (800 байтов) остается болтаться в воздухе.»?

Или иначе:
«когда вы делаете
var cur = {obj: {}, value: 55, sign: „5vvsgggs“};
testedObject[i] = cur;
delete cur.obj
V8 нормализует объект cur... При этом V8 не замечает, что после удаления в словаре будет пусто»

Нас не запутаешь! У меня все ходы записаны! Вместо *delete testedObject[i]* какой-то *delete testedObject[i].obj* подсовывают! А потом ещё и баги из скриншотов хрома в мозилу отправляют.

Евгений Степанищев (bolknote.ru) 2012

Комментарий для Глеб Арестов (http://arestov.me/):

Вместо *delete testedObject[i]* какой-то *delete testedObject[i].obj* подсовывают!

Ну так в исходной статье на Хабре речь и идёт o testedObject[i].obj.