Home >Web Front-end >JS Tutorial >What are WeakMaps in JS?
A WeakMap in JavaScript is a collection of key-value pairs where the keys are required to be objects, and the references to these keys are "weak." This means that if there are no other references to a key object, it can be garbage-collected, even if it is still in the WeakMap.
Keys must be objects:
Weak references:
Not iterable:
Useful for private data:
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"
In summary, WeakMap is a specialized collection designed for scenarios where weak references and private associations are required.
The primary difference between Map and WeakMap in JavaScript lies in their handling of keys, garbage collection, and functionality. Here’s a detailed comparison:
Feature |
|
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"
Example:
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 }
Example:
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 |
|
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. |
The above is the detailed content of What are WeakMaps in JS?. For more information, please follow other related articles on the PHP Chinese website!