JavaScript WeakMap对象
本文将介绍JavaScript中的WeakMap对象,以及如何有效地利用它们存储更多的键值对,并防止它们被垃圾回收器收集。
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)); // Output: Value 1
console.log(weakMap.get(obj2)); // Output: 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对象,使用了不同的方法,并看了一些解释相同的示例。