JavaScript 中的 WeakMap 对象

javascriptweb developmentfront end technology

本文将介绍 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 对象,并看到了一些解释相同内容的示例。


相关文章