Recherche este y este Dans les pages MDN, il semble que la seule différence entre Maps et WeakMaps soit l'absence de la propriété "size" pour WeakMaps. Mais est-ce vrai ? Quelle est la différence entre les deux ?
Réponses
Trop de publicités?WeakMap
les clés doivent être des objets, et non des valeurs primitives.
let weakMap = new WeakMap();
let obj = {};
weakMap.set(obj, "ok"); // works fine (object key)
// can't use a string as the key
weakMap.set("test", "Not ok"); // Error, because "test" is not an object
Pourquoi ????
Voyons l'exemple ci-dessous.
let user = { name: "User" };
let map = new Map();
map.set(user, "...");
user = null; // overwrite the reference
// 'user' is stored inside the map,
// We can get it by using map.keys()
Si l'on utilise un objet comme clé dans un système de
Map
alors que leMap
existe, cet objet existe aussi. Il occupe la mémoire et peut pas être récupéré par les ordures.
WeakMap
est fondamentalement différent sur ce point. Elle n'empêche pas empêche la collecte d'objets clés.
let user = { name: "User" };
let weakMap = new WeakMap();
weakMap.set(user, "...");
user = null; // overwrite the reference
// 'user' is removed from memory!
si on utilise un objet comme clé dans celui-ci, et qu'il n'y a pas d'autres références à cet objet - il sera supprimé de la mémoire (et de la carte) la carte) automatiquement.
WeakMap
n'est pas itération et méthodes de soutien clés() , valeurs() , entrées() Il n'y a donc aucun moyen de récupérer toutes les clés ou valeurs.
WeakMap ne possède que les méthodes suivantes :
- weakMap.get(key)
- weakMap.set(clé, valeur)
- weakMap.delete(key)
- weakMap.has(key)
C'est évident car si un objet a perdu toutes ses autres références (comme 'user' dans le code ci-dessus), il doit être automatiquement mis à la poubelle. Mais techniquement, il n'est pas exactement spécifié quand le nettoyage a lieu.
C'est le moteur JavaScript qui en décide. Il peut choisir d'effectuer le nettoyage de la mémoire immédiatement ou d'attendre et de faire le nettoyage plus tard, lorsque d'autres suppressions se produisent. Donc, techniquement, le nombre actuel d'éléments d'un fichier WeakMap
n'est pas connu. Le moteur peut l'avoir nettoyé ou non, ou l'avoir fait partiellement. Pour cette raison, les méthodes qui accèdent à toutes les clés/valeurs ne sont pas supportées.
Note : - Le principal domaine d'application de WeakMap est un stockage de données supplémentaire. Comme la mise en cache d'un objet jusqu'à ce que cet objet soit collecté.
En javascript, WeapMap ne contient pas de clés ou de valeurs, il manipule simplement la valeur de la clé à l'aide d'une fonction identifiant unique et définir une propriété à l'objet clé.
car il définit la propriété de key object
par méthode Object.definePropert()
, la clé ne doit pas être de type primitif .
et aussi parce que WeapMap ne contient pas réellement de paires clé-valeur, nous ne pouvons pas obtenir la propriété de longueur de weakmap.
et aussi la valeur manipulée est réaffectée à l'objet clé, le ramasseur de déchets peut facilement récupérer la clé si elle n'est pas utilisée.
Exemple de code pour la mise en œuvre.
if(typeof WeapMap != undefined){
return;
}
(function(){
var WeapMap = function(){
this.__id = '__weakmap__';
}
weakmap.set = function(key,value){
var pVal = key[this.__id];
if(pVal && pVal[0] == key){
pVal[1]=value;
}else{
Object.defineProperty(key, this.__id, {value:[key,value]});
return this;
}
}
window.WeakMap = WeakMap;
})();
référence de mise en œuvre
- Réponses précédentes
- Plus de réponses