Javascript ECMAScript 5中的WeakMap实现?

Javascript ECMAScript 5中的WeakMap实现?,javascript,ecmascript-5,ecmascript-6,Javascript,Ecmascript 5,Ecmascript 6,我遇到过一个在ES5中实现跨浏览器的应用程序。(WeakMap计划用于ES6) 如果没有JavaScript语言本身的支持,这怎么可能工作呢 编辑:我只是想说清楚,我指的是弱地图,而不是常规地图。我使用Chrome的profiler对这个项目进行了测试,这些键并没有被强引用。它们不必从WeakMap中删除就可以被GC’ed。我花了一段时间摸索代码,但后来它击中了我:键本身用于存储对值的引用 例如,将多个层设置为集合 defProp(obj, globalID, { value: store })

我遇到过一个在ES5中实现跨浏览器的应用程序。(WeakMap计划用于ES6

如果没有JavaScript语言本身的支持,这怎么可能工作呢


编辑:我只是想说清楚,我指的是地图,而不是常规地图。我使用Chrome的profiler对这个项目进行了测试,这些键并没有被强引用。它们不必从WeakMap中删除就可以被GC’ed。

我花了一段时间摸索代码,但后来它击中了我:键本身用于存储对值的引用

例如,将多个层设置为
集合

defProp(obj, globalID, { value: store });
其中
defProp
被定义为
对象。defineProperty
obj
是键,
globalID
是guid,
store
是包含该值的存储对象

然后在
get
中,它使用

obj[globalID]

这很聪明。WeakMap实际上并不包含对任何东西的引用(弱的或其他的)——它只是设置了一个策略,将值秘密存储在哪里。使用意味着您不会意外地发现存储的值——您必须知道神奇的guid才能查找它


由于键直接引用了值(WeakMap没有引用它),当所有对键的引用都消失时,它会像正常情况一样得到GCed。

我花了一段时间摸索代码,但它击中了我:键本身被用来存储对值的引用

例如,将多个层设置为
集合

defProp(obj, globalID, { value: store });
其中
defProp
被定义为
对象。defineProperty
obj
是键,
globalID
是guid,
store
是包含该值的存储对象

然后在
get
中,它使用

obj[globalID]

这很聪明。WeakMap实际上并不包含对任何东西的引用(弱的或其他的)——它只是设置了一个策略,将值秘密存储在哪里。使用意味着您不会意外地发现存储的值——您必须知道神奇的guid才能查找它


由于键直接引用了值(WeakMap没有引用它),当所有对键的引用都消失时,它会像正常情况一样获得GCed。

考虑研究源代码。@斜视它正在做一些相当深入的事情——我不明白为什么它没有对键进行强引用。例如,它不使用数组。WeakMaps是一种ES6功能,允许您将数据与对象关联,但当对象或WeakMap实例本身被垃圾收集时,仍然允许对数据进行垃圾收集。如果没有语言支持,这两项都是不可能做到的。当弱映像实例本身是GC时,大多数弱映射垫片忽略了允许数据GC的部分。考虑研究源代码。@斜视它做了相当深的事情——我不知道它如何不持有对密钥的强引用。例如,它不使用数组。WeakMaps是一种ES6功能,允许您将数据与对象关联,但当对象或WeakMap实例本身被垃圾收集时,仍然允许对数据进行垃圾收集。如果没有语言支持,这两项都是不可能做到的。当WeakMap实例本身是GC'd时,大多数WeakMap填隙片忽略了让数据被GC'd的部分。如果
obj
是WeakMap键,并且
globalID
是在
obj
上定义的,我想知道为什么
globalID
在使用
对象时不显示。getOwnPropertyNames()
。我也在想知道这一点;可惜的是,这个库太高了,它已经落后了,几乎无法阅读。必须有一个更简单的解释…弄明白了:lib作弊:它重新定义了Object.getOwnPropertyNames()。boo用于单步执行现有的本机函数。它仅重新定义
getOwnPropertyNames
,以实现弱映射。它不会破坏任何东西,
getOwnPropertyNames
”功能保持不变。该环境与ES5完全向后兼容,与ES6 WeakMaps完全向前兼容。这真是个好主意。我在中也使用了它,但它并没有提供WeakMap的一个主要属性:该值被弱保持。此垫片在键和值之间创建强引用。。。类似于仅仅将值设置为key对象上的属性。如果
obj
是WeakMap键,并且
obj
上定义了
globalID
,我想知道为什么在使用
对象时
globalID
没有显示。getOwnPropertyNames()
。我也在想同样的问题;可惜的是,这个库太高了,它已经落后了,几乎无法阅读。必须有一个更简单的解释…弄明白了:lib作弊:它重新定义了Object.getOwnPropertyNames()。boo用于单步执行现有的本机函数。它仅重新定义
getOwnPropertyNames
,以实现弱映射。它不会破坏任何东西,
getOwnPropertyNames
”功能保持不变。该环境与ES5完全向后兼容,与ES6 WeakMaps完全向前兼容。这真是个好主意。我在中也使用了它,但它并没有提供WeakMap的一个主要属性:该值被弱保持。此垫片在键和值之间创建强引用。。。类似于仅将值设置为键对象上的属性。