了解弱地图

Ran*_*lue 9 javascript weakmap ecmascript-6

ECMAScript 6引入了弱映射,在带有--harmony标志的Node.JS v0.11.3中可用.考虑以下.

let weakMap = WeakMap();
let key = [];
let rubbish = 'fish cans';

weakMap.set(key, rubbish);
rubbish = 'empty bottle';

// Prints "fish cans"
console.log(weakMap.get(key));
Run Code Online (Sandbox Code Playgroud)

我的印象是,对于弱映射,从键到值的引用很弱,因此如果对值的唯一引用是键,则无法再访问该值.

那么为什么值'fish cans'仍然可以访问而不是垃圾收集?可变rubbish不再引用它,并且从参考key'fish cans',从垃圾收集器的点即不存在的.我错过了什么?

a b*_*ver 17

弱点是关键,而不是价值.从目前的草案:

WeakMap旨在提供一种机制,用于以不泄漏内存资源的方式动态地将状态与对象关联,如果在没有WeakMap的情况下,该对象变得不可访问并且受到实现的垃圾收集机制的资源回收的影响.

假设你有一个DOM元素,并希望一些数据与之相关联,并使用WeakMap该:weakMap.set(domElement, data);.删除DOM元素后,弱映射中的条目也会被删除.

另一方面,只要DOM元素存在,您就不希望删除数据,因为在弱映射之外没有其他引用.

除此之外,它'fish cans'是一种原始类型,因此不受垃圾收集的影响.


Ber*_*rgi 12

那么为什么值'fish cans'仍然可以访问而不是垃圾收集?变量垃圾不再引用它,并且从键到的引用'fish cans'是弱的,即从垃圾收集器的角度来看是不存在的.我错过了什么?

变量rubbish永远不是需要引用它的变量.只要未收集密钥,从密钥到值的关联(引用)仍然存在.GC无法看到的弱引用是从映射到键/值对的那个(将使映射可枚举的那个).但是你key仍然存在,你可以在地图中获得为它存储的每个值:

var map = WeakMap(),
    key = [];

map.set(key, 'fish cans');
console.log(map.get(key)); // Prints "fish cans"
Run Code Online (Sandbox Code Playgroud)

为了证明这个弱点,你必须使用以下内容:

var map = WeakMap(),
    key = [];

map.set(key, 'fish cans');
// map.size == 1
key = null;
// map.size == 0 - the fish cans got garbage-collected together with the key
map.get(???) // impossible now
Run Code Online (Sandbox Code Playgroud)