Я хотел бы имитировать объекты значений в 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
явно мешает сборке мусора. Как я могу избежать/уменьшить утечку памяти? Или есть альтернативный подход для имитации объектов-значений?