问题标签 [weakmap]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
javascript - 我可以在不阻止 GC 的情况下从 WeakMap 值对象中存储对关键对象的引用吗?
由于 GC 检测对象图的孤立孤岛以找到从内存中删除的候选对象,并且 WeakMap 不会用弱引用打破孤岛边界,那么这个引用也不用弱引用打破孤岛边界是WeakMap -> KeyObject
有意义的,而引用显然是强的。WeakMap -> Value -> KeyObject
WeakMap -> Value
Value -> KeyObject
例子:
javascript - 在不使用 WeakMap.set 方法的情况下更改 JavaScript WeakMap 键/值对的值有什么缺点吗?
我刚刚开始学习 ES6 WeakMap 功能的用例。我已经阅读了很多关于它的内容,但我无法找到这个特定问题的答案。
我正在为终端实现一个 Node.js Minesweeper 游戏——只是为了好玩和练习。我创建了一个名为 MineBoard 的类,它将存储游戏运行所需的所有数据和方法。我希望某些成员,例如 _uncoveredCount(未覆盖的方块数)和 _winningCount(获胜所需的未覆盖的方块数)对用户保持无法访问。虽然这个游戏没有投入生产,但我仍然希望它是不可吃的;) - _ 前缀的命名约定来表示私人成员是不够的。
为此 - 我实现了一个 WeakMap 来存储上述两个示例和其他私有成员。
方法一:
在上面这样做对我来说更容易 - 而且眼睛也更容易。然而,我见过的大多数 WeakMap 实现的例子都遵循下面的风格。
方法二:
所以我的问题是 - 使用我没有看到的方法 1 有什么缺点吗?这使得更简单的解决方案和 IMO 更易于阅读和遵循代码。
谢谢!
javascript - 如何在 ES5 中实现弱映射?
还有另一个问题问同样的问题,但我无法理解接受的答案。
有问题的库似乎用于Object.defineProperty
添加对要存储的对象的引用(尽管间接通过另一个对象)。
但是......当然这意味着该对象不能因为这个链接而被垃圾收集?
我错过了什么?
是否真的可以创建一个对象并将其存储在某个地方而无需维护垃圾收集器可注意到的引用?(在 ES2015 之前)
接受的答案:
我花了一些时间来摸索代码,但后来它击中了我:键本身用于存储对值的引用。
例如,将其设置为几层
defProp(obj, globalID, { value: store }); 其中 defProp 已定义为 Object.defineProperty,obj 是键,globalID 是 guid,store 是包含值的存储对象。
然后在 get 它查找值
对象[全局ID];
这是非常聪明的。WeakMap 实际上并不包含对任何东西(弱或其他)的引用——它只是设置了一个秘密存储值的策略。使用 Object.defineProperty 意味着您不会意外发现值存储——您必须知道查找它的魔法指南。
由于键直接引用值(而 WeakMap 不引用它),当所有对键的引用都消失时,它会像往常一样进行 GC。
javascript - WeakMap 倒置
有没有办法在 Javascript 中创建任何其他弱引用的 WeakMap 来存储键值对,其中键是字符串/数字,值是对象。
引用必须像这样工作:
我创建了一种树结构,它跟踪当前范围内仍在使用的引用。
我会做很多合并,递归地清理一个深度嵌套的结构对于这个用例来说效率很低。
javascript - Map 的垃圾收集最近有变化吗?
Map和WeakMap之间的主要区别(如我所想):
如果我们在Map中存储了一个对象,然后在其他地方没有引用该对象,那么该对象仍然不会被包含在垃圾收集过程中,我们仍然可以在 Map 中访问它。
但是,如果它存储在WeakMap中,然后该对象没有被引用到代码中的其他地方,那么它将被垃圾收集。
现在看看这个例子,我得到的输出看起来就像是 Map 中不再有引用的对象现在正在被垃圾收集:
规范是否发生了变化,因为我在 MDN 中看不到某种声明,或者我误解了什么?
javascript - 没有内存泄漏的 WeakMap 模式单例
如果应用程序中未使用对它的引用,我希望从存储中删除该对象。但是如果应用程序中的链接存在,并且我们试图创建一个具有相同 ID 的对象,则返回该对象,而不是创建一个新对象。没有析构函数我怎么能做到?
但是当所有对对象的引用从应用程序中消失,并且对象从存储中删除时,创建对象的新实例就没有什么不好了
javascript - 标记模板文字的 TemplateObject 数组是否被其领域弱引用?
JavaScript 运行时创建一个冻结数组,Object.freeze(['str0 ', ' str1'])
但具有附加.raw
属性。
是否可以将该对象用作 a 中的键WeakMap
以避免每次通过循环时都必须基于数组重做工作?
第12.2.9.3 节运行时语义:GetTemplateObject ( templateLiteral )描述了如何缓存此值:
- 让领域成为当前领域记录。
- 让templateRegistry为领域.[[TemplateMap]]。
所以tag
在上面的循环中从使用到使用应该是相同的,这对于键来说是一个很好的属性。
在我看来, [[TemplateMap]] 将不得不弱引用模板对象数组,否则
会泄漏内存。
我在规范中没有看到任何内容,但是对于广泛使用的 JavaScript 引擎,是否最终会收集用于标记字符串模板的 WeakMap 条目不在可重新输入的范围内?
我问是因为我已经根据这个假设实现了一些东西,但还没有弄清楚如何测试它。
javascript - 将对象设置为 null 时的 JavaScript(ES6)WeakMap 垃圾回收
我刚刚读到 WeakMaps 通过专门使用对象作为键来利用垃圾收集,并且将对象分配给 null 等同于删除它:
然后我将对象设置为null:
为什么输出一样?难道不应该删除它,以便 gc 可以重用以前在应用程序中占用的内存吗?我将不胜感激。谢谢!
javascript - Javascript 中的弱映射
您能否在下面的代码中阐明为什么在将对象添加到 WeakMaps 时使用布尔值。我知道 set 需要两个(键和值)参数。布尔值也会打印在控制台中……这是我的疑问……</p>
提前致谢。