Если вы создадите следующий файл HTML

запустите его в своем браузере и откройте диспетчер задач, вы могли заметить, что браузер занимает ограниченный объем памяти ~ 200 МБ. Но что, если мы обновим одну цифру в нашем коде

то есть замените 12 на 13, запустите его в браузере и посмотрите на память процесса. Он растет неудержимо и за полминуты приводит к сбою браузера! Почему это происходит?

Каждый раз, когда мы вызываем функцию String.prototype.substring, она возвращает новый экземпляр строки, который сохраняет... ссылку на исходную строку! Вот как V8 организует память для строк из соображений постоянства. Исключением является случай, когда длина строки нового экземпляра меньше 13 — в этом случае ссылка на исходную строку не сохраняется. Итак, в нашем примере arr содержит не просто короткие строки (13), а на самом деле огромные (25 * 1024 * 1024). Как этого избежать? К сожалению, не существует задокументированного метода «вырезать» родителей из строк, потому что мы можем сделать следующее (обновление строки 9):

Этот маневр разрывает связь с исходной строкой и предотвращает утечку памяти.