发布于 2015-05-28 13:17:40
当它们的键/值引用的对象被删除时,它们的行为都不同。让我们以以下示例代码为例:
var map = new Map();
var weakmap = new WeakMap();
(function(){
var a = {x: 12};
var b = {y: 12};
map.set(a, 1);
weakmap.set(b, 2);
})()
上面的生命被执行了,我们再也不能引用{x: 12}
和{y: 12}
了。垃圾收集器继续并从“WeakMap”中删除键b指针,并且还从内存中删除{y: 12}
。但是在“映射”的情况下,垃圾收集器不会从“映射”中删除指针,也不会从内存中删除{x: 12}
。
摘要: WeakMap允许垃圾收集器执行其任务,但不允许映射。
参考资料:http://qnimate.com/difference-between-map-and-weakmap-in-javascript/
发布于 2016-01-24 03:53:43
也许下一个解释对某些人来说会更清楚。
var k1 = {a: 1};
var k2 = {b: 2};
var map = new Map();
var wm = new WeakMap();
map.set(k1, 'k1');
wm.set(k2, 'k2');
k1 = null;
map.forEach(function (val, key) {
console.log(key, val); // k1 {a: 1}
});
k2 = null;
wm.get(k2); // undefined
如你所见,从内存中删除k1
密钥后,我们仍然可以在地图中访问它。同时,删除WeakMap的k2
键也会通过引用将其从wm
中删除。
这就是为什么WeakMap没有像forEach这样的可枚举方法,因为没有WeakMap键列表,它们只是对另一个对象的引用。
https://stackoverflow.com/questions/15604168
复制相似问题