L'objet WeakMap représente une collection de paires clé-valeur dont les clés sont des objets et pour lesquelles les références sont « faibles » et les valeurs des valeurs quelconques.

Note : vous pouvez en savoir plus sur les WeakMap en lisant l'article sur les collections à clé.

Syntaxe

new WeakMap([itérable])

Paramètres

itérable
Paramètre optionnel. Un tableau (objet Array) ou tout autre objet itérable dont les éléments sont des paires composées d'une clé et d'une valeur (des tableaux de 2 éléments). Chaque paire sera ajoutée à la carte (map en anglais). null sera traité comme undefined.

Description

Les clés des objets WeakMap sont nécessairement du type Object. Des types de données primitifs ne sont pas autorisés pour les clés (ex : un Symbol ne peut pas être une clé dans un WeakMap).

Les clés d'une WeakMap sont référencées faiblement. Cela signifie que s'il n'existe aucune autre référence « forte » vers la clé, l'élément (la clé et la valeur) sera retiré de la WeakMap par le ramasse-miettes.

Pourquoi WeakMap ?

Avec un certain recul, on peut voir que cette API aurait pu être implémentée en JavaScript grâce à deux tableaux (un tableau pour stocker les clés, l'autre pour les valeurs) associées à 4 méthodes.

Une telle implémentation présente deux inconvénients principaux. Le premier est que la recherche serait effectué en O(n) (avec n le nombre de clés). Le second inconvénient concerne les fuites mémoires. Si la carte (map) est construite manuellement, le tableau contenant les clés serait obligé de garder les références vers les objets que sont les clés, ce qui les empêcheraient d'être nettoyés par le ramasse-miette. Grâce aux objets natifs WeakMap, les références vers les clés sont faibles (weak) ce qui permet au ramasse miette de nettoyer l'objet au cas où il n'y aurait pas d'autres références vers cet objet.

Étant donné que les références sont faibles, il est impossible d'énumérer les clés des objets WeakMap (c'est-à-dire qu'on ne dispose pas d'une méthode renvoyant la liste des clés). Si c'était le cas, la liste dépendrait d'un état lié au ramasse-miette et il n'y aurait pas de façon déterministe de connaître le résultat. Si vous souhaitez avoir une liste de clés, vous devriez plutôt utiliser un objet Map.

Propriétés

WeakMap.length
La valeur de la propriété length vaut 0.
WeakMap.prototype
Cette propriété représente le prototype du constructeur WeakMap. Il permet d'ajouter des propriétés pour toutes les instances de WeakMap.

Instances de WeakMap

Toutes les instances de WeakMap héritent de WeakMap.prototype.

Propriétés

Méthodes

Exemple

Utiliser WeakMap

var wm1 = new WeakMap(),
    wm2 = new WeakMap(),
    wm3 = new WeakMap();
var o1 = {},
    o2 = function(){},
    o3 = window;

wm1.set(o1, 37);
wm1.set(o2, "azerty");
wm2.set(o1, o2); // une valeur peut être n'importe quoi, y compris un objet ou une fonction
wm2.set(o3, undefined);
wm2.set(wm1, wm2); // Les clés et les valeurs peuvent n'importe quels objets, y compris des WeakMap

wm1.get(o2); // "azerty"
wm2.get(o2); // undefined car il n'y a pas de valeur pour o2 sur wm2
wm2.get(o3); // undefined car c'est la valeur utilisée

wm1.has(o2); // true
wm2.has(o2); // false
wm2.has(o3); // true (même si la valeur est 'undefined')

wm3.set(o1, 37);
wm3.get(o1); // 37

wm1.has(o1);   // true
wm1.delete(o1);
wm1.has(o1);   // false

Implémenter une classe semblable à WeakMap avec une méthode .clear()

class ClearableWeakMap {
    constructor(init) {
        this._wm = new WeakMap(init)
    }
    clear() {
        this._wm = new WeakMap()
    }
    delete(k) {
        return this._wm.delete(k)
    }
    get(k) {
        return this._wm.get(k)
    }
    has(k) {
        return this._wm.has(k)
    }
    set(k, v) {
        this._wm.set(k, v)
        return this
    }
}

Spécifications

Spécification État Commentaires
ECMAScript 2015 (6th Edition, ECMA-262)
La définition de 'WeakMap' dans cette spécification.
Standard Définition initiale.
ECMAScript Latest Draft (ECMA-262)
La définition de 'WeakMap' dans cette spécification.
Projet  

Compatibilité des navigateurs

Update compatibility data on GitHub
OrdinateurMobileServeur
ChromeEdgeFirefoxInternet ExplorerOperaSafariWebview AndroidChrome pour AndroidEdge MobileFirefox pour AndroidOpera pour AndroidSafari pour iOSSamsung InternetNode.js
Support simpleChrome Support complet 36Edge Support complet 12Firefox Support complet 6IE Support complet 11Opera Support complet 23Safari Support complet 8WebView Android Support complet 37Chrome Android Support complet 36Edge Mobile Support complet 12Firefox Android Support complet 6Opera Android Support complet 23Safari iOS Support complet 8Samsung Internet Android Support complet Ouinodejs Support complet 0.12
Support complet 0.12
Support complet 0.10
Désactivée
Désactivée From version 0.10: this feature is behind the --harmony runtime flag.
new WeakMap(iterable)Chrome Support complet 38Edge Support complet 12Firefox Support complet 36IE Aucun support NonOpera Support complet 25Safari Support complet 9WebView Android Support complet 38Chrome Android Support complet 38Edge Mobile Support complet 12Firefox Android Support complet 36Opera Android Support complet 25Safari iOS Support complet 9Samsung Internet Android Support complet Ouinodejs Support complet 0.12
new WeakMap(null)Chrome Support complet OuiEdge Support complet 12Firefox Support complet 37IE Support complet 11Opera ? Safari Support complet 8WebView Android Support complet OuiChrome Android Support complet OuiEdge Mobile Support complet 12Firefox Android Support complet 37Opera Android ? Safari iOS Support complet 8Samsung Internet Android Support complet Ouinodejs Support complet 0.12
Support complet 0.12
Support complet 0.10
Désactivée
Désactivée From version 0.10: this feature is behind the --harmony runtime flag.
WeakMap() without new throwsChrome Support complet OuiEdge Support complet 12Firefox Support complet 42IE Support complet 11Opera Support complet OuiSafari Support complet 9WebView Android Support complet OuiChrome Android Support complet OuiEdge Mobile Support complet 12Firefox Android Support complet 42Opera Android Support complet OuiSafari iOS Support complet 9Samsung Internet Android Support complet Ouinodejs Support complet 0.12
clear
ObsolèteNon-standard
Chrome Aucun support 36 — 43Edge Aucun support NonFirefox Aucun support 20 — 46IE Support complet 11Opera Aucun support 25 — 30Safari Aucun support 8 — 9WebView Android Aucun support 37 — 43Chrome Android Aucun support 36 — 43Edge Mobile Aucun support NonFirefox Android Aucun support 20 — 46Opera Android Aucun support 25 — 30Safari iOS Aucun support 8 — 9Samsung Internet Android Support complet Ouinodejs Support complet Oui
deleteChrome Support complet 36Edge Support complet OuiFirefox Support complet 6
Notes
Support complet 6
Notes
Notes Prior to Firefox 38, this method threw a TypeError when the key parameter was not an object. This has been fixed in version 38 and later to return false as per the ES2015 standard.
IE Support complet 11Opera Support complet 23Safari Support complet 8WebView Android Support complet 37Chrome Android Support complet 36Edge Mobile Support complet OuiFirefox Android Support complet 6
Notes
Support complet 6
Notes
Notes Prior to Firefox 38, this method threw a TypeError when the key parameter was not an object. This has been fixed in version 38 and later to return false as per the ES2015 standard.
Opera Android Support complet 23Safari iOS Support complet 8Samsung Internet Android Support complet Ouinodejs Support complet 0.12
Support complet 0.12
Support complet 0.10
Désactivée
Désactivée From version 0.10: this feature is behind the --harmony runtime flag.
getChrome Support complet 36Edge Support complet OuiFirefox Support complet 6
Notes
Support complet 6
Notes
Notes Prior to Firefox 38, this method threw a TypeError when the key parameter was not an object. However, the ES2015 specification specifies to return undefined instead. Furthermore, WeakMap.prototype.get accepted an optional second argument as a fallback value, which is not part of the standard. Both non-standard behaviors are removed in version 38 and higher.
IE Support complet 11Opera Support complet 23Safari Support complet 8WebView Android Support complet 37Chrome Android Support complet 36Edge Mobile Support complet OuiFirefox Android Support complet 6
Notes
Support complet 6
Notes
Notes Prior to Firefox 38, this method threw a TypeError when the key parameter was not an object. However, the ES2015 specification specifies to return undefined instead. Furthermore, WeakMap.prototype.get accepted an optional second argument as a fallback value, which is not part of the standard. Both non-standard behaviors are removed in version 38 and higher.
Opera Android Support complet 23Safari iOS Support complet 8Samsung Internet Android Support complet Ouinodejs Support complet 0.12
Support complet 0.12
Support complet 0.10
Désactivée
Désactivée From version 0.10: this feature is behind the --harmony runtime flag.
hasChrome Support complet 36Edge Support complet OuiFirefox Support complet 6
Notes
Support complet 6
Notes
Notes Prior to Firefox 38, this method threw a TypeError when the key parameter was not an object. This has been fixed in version 38 and later to return false as per the ES2015 standard.
IE Support complet 11Opera Support complet 23Safari Support complet 8WebView Android Support complet 37Chrome Android Support complet 36Edge Mobile Support complet OuiFirefox Android Support complet 6
Notes
Support complet 6
Notes
Notes Prior to Firefox 38, this method threw a TypeError when the key parameter was not an object. This has been fixed in version 38 and later to return false as per the ES2015 standard.
Opera Android Support complet 23Safari iOS Support complet 8Samsung Internet Android Support complet Ouinodejs Support complet 0.12
Support complet 0.12
Support complet 0.10
Désactivée
Désactivée From version 0.10: this feature is behind the --harmony runtime flag.
prototypeChrome Support complet 36Edge Support complet OuiFirefox Support complet 6IE Support complet 11Opera Support complet 23Safari Support complet 8WebView Android Support complet 37Chrome Android Support complet 36Edge Mobile Support complet OuiFirefox Android Support complet 6Opera Android Support complet 23Safari iOS Support complet 8Samsung Internet Android Support complet Ouinodejs Support complet 0.12
Support complet 0.12
Support complet 0.10
Désactivée
Désactivée From version 0.10: this feature is behind the --harmony runtime flag.
setChrome Support complet 36Edge Support complet OuiFirefox Support complet 6
Notes
Support complet 6
Notes
Notes Prior to Firefox 38, this method threw a TypeError when the key parameter was not an object. This has been fixed in version 38 and later to return false as per the ES2015 standard.
IE Support partiel 11
Notes
Support partiel 11
Notes
Notes Returns 'undefined' instead of the 'Map' object.
Opera Support complet 23Safari Support complet 8WebView Android Support complet 37Chrome Android Support complet 36Edge Mobile Support complet OuiFirefox Android Support complet 6
Notes
Support complet 6
Notes
Notes Prior to Firefox 38, this method threw a TypeError when the key parameter was not an object. This has been fixed in version 38 and later to return false as per the ES2015 standard.
Opera Android Support complet 23Safari iOS Support complet 8Samsung Internet Android Support complet Ouinodejs Support complet 0.12
Support complet 0.12
Support complet 0.10
Désactivée
Désactivée From version 0.10: this feature is behind the --harmony runtime flag.

Légende

Support complet  
Support complet
Support partiel  
Support partiel
Aucun support  
Aucun support
Compatibilité inconnue  
Compatibilité inconnue
Fonctionnalité non-standard. Celle-ci peut être incorrectement supportée par les autres navigateurs.
Fonctionnalité non-standard. Celle-ci peut être incorrectement supportée par les autres navigateurs.
Obsolète. Les nouveaux sites web ne doivent pas utiliser cette fonctionnalité.
Obsolète. Les nouveaux sites web ne doivent pas utiliser cette fonctionnalité.
Voir les notes d'implémentation.
Voir les notes d'implémentation.
Une action explicite de l'utilisateur est nécessaire pour activer cette fonctionnalité.
Une action explicite de l'utilisateur est nécessaire pour activer cette fonctionnalité.

Voir aussi

Étiquettes et contributeurs liés au document

Contributeurs à cette page : SphinxKnight, 316k, Spotinux
Dernière mise à jour par : SphinxKnight,