Использование памяти объектов JavaScript с цифровыми клавишами

#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, динамические объектные ключи по сути являются антипаттером.