JavaScript 中的 WeakMap 对象
本文将介绍 JavaScript 中的 WeakMap 对象,以及如何利用它们有效地在 JavaScript 中存储更多键值对,并防止它们被垃圾收集器收集。
WeakMap 对象是 JavaScript 的原生数据结构,随 ES6(ECMAScript 2015)版本发布而添加。借助 WeakMap 对象,我们可以存储与对象关联的私有数据,而不会干扰垃圾收集。
让我们看一些示例和方法,以更好地理解这个概念 -
示例 1 - 添加和检索值
WeakMap 的键必须是对象,值可以是任何东西。使用 set(key, value) 和 get(key) 方法,我们可以将键值对添加到 WeakMap 并检索值。
在此示例中,我们将 -
创建一个 WeakMap 对象,并使用 set() 方法添加键值对。
使用 get() 方法检索值。
文件名 - index.html
<html> <head> <title>WeakMap object in JavaScript.</title> <script> let weakMap = new WeakMap(); let obj1 = {}; let obj2 = {}; weakMap.set(obj1, 'Value 1'); weakMap.set(obj2, 'Value 2'); console.log(weakMap.get(obj1)); // 输出: Value 1 console.log(weakMap.get(obj2)); // 输出: Value 2 </script> </head> <body> <h1>WeakMap Object - Adding and Retrieving Values</h1> </body> </html>
输出
结果将如下图所示。
示例 2 - WeakMap 垃圾收集及其弱引用
WeakMap 对其键具有弱引用,这意味着如果用作 WeakMap 中键的对象没有其他引用,则当它不再使用时将被垃圾收集。当对象被垃圾收集时,相应的键值对将自动从 WeakMap 中删除。
在此示例中,我们将 -
在函数内创建一个对象 obj,并将键值对添加到 WeakMap。
由于 obj 在函数外部不可访问,因此它符合垃圾回收条件,并且键值对将自动从 WeakMap 中删除。
文件名 - index.html
<html> <head> <title>WeakMap object in JavaScript.</title> <script> let myMap = new Map(); myMap.set('name', 'John'); myMap.set('age', 30); myMap.forEach((value, key) => { console.log(`${key}: ${value}`); }); for (let key of myMap.keys()) { console.log(key); } for (let value of myMap.values()) { console.log(value); } for (let [key, value] of myMap.entries()) { console.log(`${key}: ${value}`); } </script> </head> <body> <h1>Map Object - Iterating over a Map</h1> </body> </html>
输出
结果将如下图所示。
结论
总之,JavaScript 中的 WeakMap 对象可用于将辅助数据与对象关联,而不会干扰垃圾回收。它对键使用弱引用,当对象不再在应用程序中使用或无法通过 DOM 树访问时,可以在垃圾回收期间自动清理键值对。我们通过不同的方法了解了什么是 JavaScript 中的 WeakMap 对象,并看到了一些解释相同内容的示例。