首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >ES6地图和WeakMap有什么不同?

ES6地图和WeakMap有什么不同?
EN

Stack Overflow用户
提问于 2013-03-25 05:22:30
回答 2查看 33.3K关注 0票数 103

纵观this和Maps页面,似乎this和WeakMaps之间唯一的区别就是缺少了WeakMaps的"size“属性。但这是真的吗?它们之间的区别是什么?

EN

回答 2

Stack Overflow用户

发布于 2015-05-28 13:17:40

当它们的键/值引用的对象被删除时,它们的行为都不同。让我们以以下示例代码为例:

代码语言:javascript
复制
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/

票数 106
EN

Stack Overflow用户

发布于 2016-01-24 03:53:43

也许下一个解释对某些人来说会更清楚。

代码语言:javascript
复制
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键列表,它们只是对另一个对象的引用。

票数 84
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15604168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档