#javascript #memory
#javascript #память
Вопрос:
Похоже, что объем памяти, необходимый для хранения структуры памяти с объектами Javascript, зависит не только от количества сохраненных объектов, но и от используемых ключей.
Давайте напишем, например, этот простой код в fiddlejs (ссылка ниже).:
for (var i=0; i<500; i ) {
o[i]={};
for (var j=0; j<500; j ) {
o[i][j]={};
o[i][j]['abc'] = {};
}
}
https://jsfiddle.net/9Lespw7g/
Затем запустите скрипт и откройте вкладку памяти Chrome (или сделайте снимок памяти с помощью Firefox). На этом этапе профилировщик должен показать что-то вроде 16 МБ выделенной памяти.
Теперь просто замените 'abc'
ключ на '900'
в предыдущем коде. (ссылка ниже)
for (var i=0; i<500; i ) {
o[i]={};
for (var j=0; j<500; j ) {
o[i][j]={};
o[i][j]['900'] = {};
}
}
https://jsfiddle.net/cfm0n7xq/
Теперь профилировщик памяти показывает, что выделено больше 1400 МБ, что имеет большое значение.
Поскольку это поведение одинаково как в Chrome, так и в Firefox, я хотел бы понять основные концепции, чтобы избежать неприятных сюрпризов в будущем, когда я использую объекты Javascript
Спасибо.
Комментарии:
1. Хотя ваш вопрос заключается в том, почему это происходит, что касается того, как это решить и, естественно, избежать неприятных сюрпризов: используйте
Map
, когда вам нужна карта. Начиная с ES6, динамические объектные ключи по сути являются антипаттером.