javascript
ecmascript-6
ecmascript-harmony
weakmap
Dmitrii Sorin
la source
la source
key
ne peut pas être collecté, car il est référencé par vous.Réponses:
De la même page, section " Pourquoi une carte faible ? " :
[Et c'est pourquoi ils n'ont pas non plus de
size
propriété]- ce qui serait le "normal"
Map
s . Non mentionné chez MDN, mais dans la proposition d'harmonie , ceux-ci ont égalementitems
,keys
etvalues
générateurs de méthodes et implémentent l'Iterator
interface .la source
new Map().get(x)
peu près le même temps de recherche que la lecture d'une propriété à partir d'un objet ordinaire?WeakMap
toujours un tableau (ou une autre collection) d'entrées, il indique simplement au garbage collector que ce sont des références faibles .Ils se comportent tous deux différemment lorsqu'un objet référencé par leurs clés / valeurs est supprimé. Prenons l'exemple de code ci-dessous:
L'IIFE ci-dessus est exécuté il n'y a aucun moyen de référencer
{x: 12}
et{y: 12}
plus. Le garbage collector continue et supprime le pointeur clé b de «WeakMap» et supprime également{y: 12}
de la mémoire. Mais dans le cas de «Map», le garbage collector ne supprime pas un pointeur de «Map» et ne le supprime pas non plus{x: 12}
de la mémoire.Résumé: WeakMap permet au garbage collector de faire sa tâche mais pas à Map.
Références: http://qnimate.com/difference-between-map-and-weakmap-in-javascript/
la source
map.entries().next().value // [{x:12}, 1]
WeakMap
ne peut avoir que des clés non primitives (pas de chaînes ou de nombres ou deSymbol
s comme clés, uniquement des tableaux, des objets, d'autres cartes, etc.).Map
mais pas dans leWeakMap
Peut-être que la prochaine explication sera plus claire pour quelqu'un.
Comme vous le voyez, après avoir supprimé la
k1
clé de la mémoire, nous pouvons toujours y accéder à l'intérieur de la carte. En même temps, la suppression de lak2
clé de WeakMap la supprimewm
également par référence.C'est pourquoi WeakMap n'a pas de méthodes énumérables comme forEach, car il n'existe pas de liste de clés WeakMap, ce ne sont que des références à un autre objet.
la source
forEach
,(key, val)
devrait être en fait(val, key)
Autre différence (source: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap ):
Une chaîne, un nombre ou un booléen ne peuvent pas non plus être utilisés comme
WeakMap
clé. AMap
peut utiliser des valeurs primitives pour les clés.la source
Depuis Javascript.info
Carte - Si nous utilisons un objet comme clé dans une carte régulière, alors que la carte existe, cet objet existe également. Il occupe de la mémoire et ne peut pas être récupéré.
Similaire à cela, si nous utilisons un objet comme clé dans une carte normale, alors que la carte existe, cet objet existe également. Il occupe de la mémoire et peut ne pas être ramassé
WeakMap - Maintenant, si nous utilisons un objet comme clé et qu'il n'y a pas d'autres références à cet objet - il sera automatiquement supprimé de la mémoire (et de la carte).
la source
WeapMap en javascript ne contient aucune clé ou valeur, il manipule simplement la valeur de clé en utilisant un identifiant unique et définit une propriété pour l'objet clé.
car elle définit la propriété
key object
par méthodeObject.definePropert()
, la clé ne doit pas être de type primitif .et aussi parce que WeapMap ne contient pas réellement de paires valeur / clé, nous ne pouvons pas obtenir la propriété length de lowmap.
et la valeur manipulée est également attribuée à l'objet clé, le garbage collector peut facilement collecter la clé si elle n'est pas utilisée.
Exemple de code pour l'implémentation.
référence de mise en œuvre
la source
id
, mais cela devrait être unique en utilisant quelque chose de Math.random et Date.now (), etc. Et en ajoutant cet identifiant dynamique, le premier point peut être résolu. Pouvez-vous me fournir une solution pour les deux derniers points.WeakMap
les clés doivent être des objets et non des valeurs primitives.Pourquoi????
Voyons l'exemple ci-dessous.
WeakMap
ne prend pas en charge l'itération et les méthodes keys () , values () , entries () , il n'y a donc aucun moyen d'en obtenir toutes les clés ou valeurs.WeakMap n'a que les méthodes suivantes:
C'est évident, comme si un objet avait perdu toutes les autres références (comme «utilisateur» dans le code ci-dessus), alors il doit être récupéré automatiquement. Mais techniquement, ce n'est pas exactement spécifié quand le nettoyage a lieu.
Le moteur JavaScript décide cela. Il peut choisir d'effectuer le nettoyage de la mémoire immédiatement ou d'attendre et de le faire plus tard lorsque d'autres suppressions se produisent. Donc, techniquement, le nombre d'éléments actuel de a
WeakMap
n'est pas connu. Le moteur peut l'avoir nettoyé ou non ou l'a fait partiellement. Pour cette raison, les méthodes qui accèdent à toutes les clés / valeurs ne sont pas prises en charge.la source