JavaScript 中的
WeakMap 是一个键值对的集合,其中键必须是 objects,以及对这些对象的引用键很“弱”。这意味着如果没有其他对关键对象的引用,即使它仍在 WeakMap 中,它也可以被垃圾回收。
键必须是对象:
弱引用:
不可迭代:
对于私人数据有用:
const weakMap = new WeakMap();
Method | Description |
---|---|
weakMap.set(key, value) | Adds a new key-value pair or updates an existing key. |
weakMap.get(key) | Retrieves the value associated with the key. |
weakMap.has(key) | Checks if the key exists in the WeakMap. |
weakMap.delete(key) | Removes the key-value pair associated with the key. |
const weakMap = new WeakMap();
const weakMap = new WeakMap(); const obj1 = { name: "Alice" }; const obj2 = { name: "Bob" }; // Adding key-value pairs weakMap.set(obj1, "Data for Alice"); weakMap.set(obj2, "Data for Bob"); // Accessing values console.log(weakMap.get(obj1)); // Output: "Data for Alice" // Checking existence console.log(weakMap.has(obj2)); // Output: true // Removing a key-value pair weakMap.delete(obj2); console.log(weakMap.has(obj2)); // Output: false
let obj = { key: "value" }; const weakMap = new WeakMap(); weakMap.set(obj, "Some data"); // Remove all references to `obj` obj = null; // The `WeakMap` entry for `obj` is automatically removed by garbage collection.
const privateData = new WeakMap(); class User { constructor(name) { privateData.set(this, { name }); } getName() { return privateData.get(this).name; } } const user = new User("Alice"); console.log(user.getName()); // Output: "Alice"
综上所述,WeakMap 是一个专门为需要弱引用和私有关联的场景而设计的集合。
JavaScript 中 Map 和 WeakMap 之间的主要区别在于它们对键、垃圾收集和功能的处理。详细对比如下:
Feature | Map | WeakMap |
---|---|---|
Key Types | Keys can be any type: objects, primitives. | Keys must be objects. |
Garbage Collection | Does not rely on garbage collection; keys persist. | Keys are held weakly and can be garbage-collected. |
Iteration | Iterable (can use for...of, forEach, etc.). | Not iterable (cannot list keys or values). |
Size Property | Has a size property to get the number of entries. | No size property available. |
Use Case | General-purpose key-value storage. | Specialized for associating metadata or private data with objects. |
Performance | Slightly slower due to strong key references. | Faster for memory-sensitive operations due to weak references. |
const weakMap = new WeakMap();
const weakMap = new WeakMap(); const obj1 = { name: "Alice" }; const obj2 = { name: "Bob" }; // Adding key-value pairs weakMap.set(obj1, "Data for Alice"); weakMap.set(obj2, "Data for Bob"); // Accessing values console.log(weakMap.get(obj1)); // Output: "Data for Alice" // Checking existence console.log(weakMap.has(obj2)); // Output: true // Removing a key-value pair weakMap.delete(obj2); console.log(weakMap.has(obj2)); // Output: false
let obj = { key: "value" }; const weakMap = new WeakMap(); weakMap.set(obj, "Some data"); // Remove all references to `obj` obj = null; // The `WeakMap` entry for `obj` is automatically removed by garbage collection.
const privateData = new WeakMap(); class User { constructor(name) { privateData.set(this, { name }); } getName() { return privateData.get(this).name; } } const user = new User("Alice"); console.log(user.getName()); // Output: "Alice"
示例:
const metadata = new WeakMap(); function trackElement(element) { metadata.set(element, { clicks: 0 }); } function incrementClicks(element) { const data = metadata.get(element); if (data) { data.clicks++; } } const button = document.createElement("button"); trackElement(button); incrementClicks(button); console.log(metadata.get(button)); // Output: { clicks: 1 }
示例:
const map = new Map(); map.set(1, "value"); // Allowed map.set("key", "value"); // Allowed map.set({}, "value"); // Allowed const weakMap = new WeakMap(); weakMap.set({}, "value"); // Allowed weakMap.set(1, "value"); // TypeError: Invalid value used as weak map key
Feature | Map | WeakMap |
---|---|---|
Flexibility | General-purpose, flexible. | Specialized, limited use case. |
Performance | Persistent key references. | Memory-efficient with weak references. |
Suitability | Iteration and long-term storage. | Private data and ephemeral relationships. |
以上是JS 中的 WeakMap 是什么?的详细内容。更多信息请关注PHP中文网其他相关文章!