Есть ли способ имитировать объекты значений в Javascript с эффективным использованием памяти?

Я хотел бы имитировать объекты значений в Javascript, полагаясь на ссылочную идентификацию. Вот мой подход:

const ValObj = toString => {
  const m = new Map();

  return o => {
    const s = toString(o);

    return m.has(s)
      ? m.get(s)
      : (m.set(s, o), o);
  };
};

const Triple = ValObj(xs => xs.toString());

const xs = Triple([1,2,3]),
  ys = Triple([1,2,3]),
  zs = Triple([3,2,1]);
  
console.log(
  xs === ys); // true
  
console.log(
  xs === zs); // false

Конечно, это работает только для простых типов объектов, для которых можно определить функцию toString, и при условии, что такие объекты рассматриваются как неизменяемые.

К сожалению, Map внутри ValObj явно мешает сборке мусора. Как я могу избежать/уменьшить утечку памяти? Или есть альтернативный подход для имитации объектов-значений?


person Community    schedule 02.02.2019    source источник
comment
Не уверен, что понял, что вы подразумеваете под мимикой. Вы хотите скопировать объект?   -  person molamk    schedule 02.02.2019
comment
Почему? Какая польза?   -  person Jonas Wilms    schedule 02.02.2019
comment
Вы второй с этим точным вопросом сегодня :-)   -  person Bergi    schedule 02.02.2019
comment
@Bergi Есть ли шанс, что когда-нибудь в язык будут добавлены слабые ссылки?   -  person    schedule 02.02.2019
comment
Да, на самом деле работа ведется   -  person Bergi    schedule 02.02.2019