Quelle est la différence entre ES6 Carte et WeakMap?
À la recherche cette et cette MDN pages, il semble que la seule différence entre les Cartes et WeakMaps est un manque de "taille" de la propriété pour WeakMaps. Mais est-ce vrai? Quelle est la différence entre eux?
- L'effet est sur le GC. WeakMaps peuvent avoir leurs clés recueillies.
- il n'y a pas d'exemple pointée sur le MDN à ce sujet. Comme aWeakMap.get(key); // 2 ...(GC action)... aWeakMap.get(key); // dire non défini
- Votre exemple est impossible.
key
ne peut être perçu, car il est référencé par vous. - je viens de remarquer qu'il n'y a pas d'exemple sur MDN sur GC actions concernant WeakMaps et des Cartes. GC effacer la mémoire pour supprimer les clés pour les deux d'entre eux, n'est-ce pas?
- La conception de la décision GC actions sont invisibles en Javascript. Vous ne pouvez pas observer la GC fait sa chose.
- La seule différence est le navigateur de l'utilisation de la mémoire si seulement
weakMap
méthodes sont utilisées surmap
. - Voir cette réponse pour plus d'informations sur ce problème.
- Je voudrais si quelqu'un pourrait-il expliquer s'il y a des différences de performances entre
Map
etWeakMap
. C'était demandé ailleurs, mais cette question a été fermé comme un doublon de celui-ci. Cependant, aucun des actuels des réponses à cette question résoudre les problèmes de performance.
Vous devez vous connecter pour publier un commentaire.
De la même page, dans la section "Pourquoi Faible la Carte?":
[Et c'est pourquoi ils n'ont pas de
size
propriété ainsi]‐ ce qui serait le "normal"
Map
s. Ne sont pas mentionnés au MDN, mais dans le l'harmonie proposition, ceux-ci sontitems
,keys
etvalues
générateur de méthodes et de mettre en œuvre laIterator
de l'interface.new Map().get(x)
a environ le même temps que la lecture d'une propriété d'un objet ordinaire?WeakMap
a encore un tableau (ou autre) des entrées, il dit juste que le garbage collector que ceux-ci sont références faibles.Ils se comportent différemment lorsqu'un objet référencé par leurs clés/valeurs est supprimé. Prenons l'exemple ci-dessous de code:
Ci-dessus IIFE est exécuté, il n'y a aucun moyen que nous pouvons référence
{x: 12}
et{y: 12}
plus. Garbage collector va de l'avant et supprime la clé b pointeur de la “WeakMap” et supprime également{y: 12}
de la mémoire. Mais dans le cas de la “Carte”, le garbage collector ne pas supprimer un pointeur de la “Carte” et aussi ne pas supprimer{x: 12}
de la mémoire.Résumé: WeakMap permet garbage collector pour faire son travail, mais pas la Carte.
Références: http://qnimate.com/difference-between-map-and-weakmap-in-javascript/
map.entries().next().value // [{x:12}, 1]
WeakMap
ne peut avoir non primitif touches (pas de chaînes de caractères ou de chiffres, ouSymbol
s comme des clés, seulement des tableaux, des objets, d'autres cartes, etc.).{x: 12}
et{y: 12}
plus." - Mais{x: 12}
est toujours dans leMap
, comme vous allez à l'expliquer.Map
mais pas dans leWeakMap
{}
oufunction() {}
.Peut-être la prochaine explication sera plus clair pour quelqu'un.
Comme vous le voyez, après la suppression de
k1
clé de la mémoire, nous pouvons toujours y accéder à l'intérieur de la carte. Dans le même temps, la suppressionk2
clé de WeakMap supprime dewm
ainsi par référence.C'est pourquoi WeakMap n'a pas énumérable méthodes comme forEach, car il n'y a pas une telle chose comme une liste de WeakMap clés, ils sont juste des références à d'autre objets.
forEach
,(key, val)
devrait être(val, key)
Une autre différence (source: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap):
Ni une chaîne de caractères, nombre, booléen ou être utilisé comme un
WeakMap
clé. UnMap
peut utiliser des valeurs primitives pour les clés.WeapMap en javascript ne détient pas les clés ou les valeurs, il vient de manipuler la valeur de la clé à l'aide d'un id unique et définir la propriété d'un objet clé.
car il définir la propriété
key
par la méthodeObject.definePropert()
, clé ne doit pas être de type primitif.et aussi parce que WeapMap ne contiennent pas réellement de paires clé-valeur, nous ne pouvons pas obtenir la longueur de la propriété de weakmap.
et également manipulé valeur est affectée à la touche, le garbage collector peut facilement recueillir clé si elle n'utilisez.
Exemple de code pour la mise en œuvre.
de référence de la mise en œuvre