前段时间在看技术文章时看到 WeakMap 很陌生 感觉有点out了 然后了解了下
MDN上说 WeakMap 对象是一组键/值对的集合,其中的键是弱引用的。其键必须是对象,而值可以是任意的。
语法也很简单
const wp = new WeakMap();
在使用的过程中我们需要注意 WeakMap 的 key 只能是 Object
类型
// 创建一个在每个实例中存储私有变量的对象
const internal = obj => {
if (!wp.has(obj)) {
wp.set(obj, {});
}
return wp.get(obj);
}
class Shape{
constructor(width, height) {
internal(this).width = width;
internal(this).height = height;
}
get area() {
return internal(this).width * internal(this).height;
}
}
const square = new Shape(10, 10);
console.log(square.area);//100
console.log(map.get(square));//根据对象获得返回值 { height: 100, width: 100 }
WeakMap 好处是在遍历属性时或者在执行 JSON.stringify 时不会展示出实例的私有属性,但它依赖于一个放在类外面的可以访问和操作的 WeakMap 变量 ,WeakMap 每个键对自己所引用对象的引用是 "弱引用", 这意味着,如果没有其他引用和该键引用同一个对象,这个对象将会被当作垃圾回收,从而得到不确定的结果。
就是说WeakMap 里面的数据可能被垃圾回收机制清除或者一个对应在WeakMap结构的对象在外部被删除时,上述情况所对应的WeakMap的键值对也会被自动被移除, 因此,如果你想要这种类型对象的 key 值的列表,你应该使用 Map。
其他
var wm1 = new WeakMap(),
wm2 = new WeakMap(),
wm3 = new WeakMap();
var o1 = {},
o2 = function(){},
o3 = window;
wm1.set(o1, 37);
wm1.set(o2, "azerty");
wm2.set(o1, o2); // value可以是任意值,包括一个对象
wm2.set(o3, undefined);
wm2.set(wm1, wm2); // 键和值可以是任意对象,甚至另外一个WeakMap对象
wm1.get(o2); // "azerty"
wm2.get(o2); // undefined,wm2中没有o2这个键
wm2.get(o3); // undefined,值就是undefined
在上面的例子中需要注意 对象o1 经过 wm1.set(o1, 37); 并不会影响本身的值 还是为={} 只是在wm1 中形成了键值对
方法:
WeakMap.prototype.delete(key)
移除key的关联对象。执行后 WeakMap.prototype.has(key)返回
false。
WeakMap.prototype.get(key)
返回key关联对象
, 或者 undefined
(没有key关联对象时)。
WeakMap.prototype.has(key)
根据是否有key关联对象返回一个Boolean值。
WeakMap.prototype.set(key, value)
在WeakMap中设置一组key关联对象,返回这个 WeakMap
对象。
WeakMap.prototype.clear()
从WeakMap中移除所有的
key/value 。 (参考 WeakMap
)