Maison >interface Web >js tutoriel >Que sont les WeakMaps en JS ?
Une WeakMap en JavaScript est une collection de paires clé-valeur où les clés doivent être des objets, et les références à celles-ci les clés sont "faibles". Cela signifie que s'il n'y a pas d'autres références à un objet clé, celui-ci peut être récupéré, même s'il se trouve toujours dans WeakMap.
Les clés doivent être des objets :
Références faibles :
Non itérable :
Utile pour les données privées :
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"
En résumé, WeakMap est une collection spécialisée conçue pour les scénarios où des références faibles et des associations privées sont requises.
La principale différence entre Map et WeakMap en JavaScript réside dans leur gestion des clés, du garbage collection et des fonctionnalités. Voici une comparaison détaillée :
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"
Exemple :
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 }
Exemple :
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. |
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!