我想在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
显然会干扰垃圾回收。如何避免/减少内存泄漏?或者是有用于模仿值对象的替代方法?