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中文網其他相關文章!