Какую структуру нужно использовать для хранения данных, которые быстро добавляются и удаляются?

Есть большое количество объектов (~10000+), в которые в произвольном порядке могут добавляться около 50 заранее известных новых свойств (с разными значениями). Когда свойство уже использовано и больше не нужно, оно удаляется через delete

* В частности, такое сложилось в игре: Система боевых эффектов персонажей, при размене ударов раз в пару секунд, у всех ботов регулярно включаются / выключаются разные эффекты.

Если искать в гугле что-то вроде «js engine optimization» можно найти статьи ( пример-1, пример-2 ), где утверждается, что при создании объектов используется механизм "hidden class":

function Point(x, y) {
  this.x = x;
  this.y = y;
}

var p1 = new Point(1, 2);
p1.a = 5;
p1.b = 6;

var p2 = new Point(3, 4);
p2.b = 7;
p2.a = 8;

JS создает один скрытый класс для p1, и другой - для p2, т.к. свойства a и b добавляются в разном порядке. Соответственно, рекомендуется изначально добавлять все свойства в одинаковом порядке.

Отсюда вопросы:

  1. Есть ли у этого механизма какие-то ограничения по максимальному количеству созданных классов? Очевидно, для 50 свойств физически невозможно создать 50! классов. (или я не так понял, как это работает?)
  2. Создавать объекты с одинаковыми, но пустыми свойствами, а вместо delete, давать им значения null / undefined — Хорошо или плохо? Изначально казалось, что используя delete, освобождаю память от лишних свойств. А на деле получается, это только забивает его - созданием новых скрытых классов, при добавлении новых свойств?

Ответы (1 шт):

Автор решения: Руслан Шматеев
  1. "Когда свойство создается динамически, или свойство удаляется или изменяется, создается другой скрытый класс.". То есть каждый раз когда свойство создается динамически создается класс то есть сколько свойств только и классов (вообще создается класс не только при создании свойства но и изменении и удалении, но так будет проще) по этому лимитов практически нету (уж точно не меньше чем свойств).
  2. Присваивать значения null / undefined и delete это одно и тоже. Вообще для небольших массивов / объектов delete подходит тем что можно будет использовать метод filter что бы вычистить его от всего лишнего, но в случае с большим массивом / объектом (~10000+) этот способ не подходит. И да это только больше забивает память вместо очищения.
→ Ссылка