Les clés d'objet simples doivent être des chaînes, tandis qu'un Map
peut avoir des clés de n'importe quel type.
Mais j'ai peu d'utilité pour cela dans la pratique. Dans presque tous les cas, je me retrouve quand même à utiliser des chaînes comme clés. Et probablement new Map()
est plus lent que {}
. Y a-t-il une autre raison pour laquelle il serait préférable d'utiliser un Map
au lieu d'un simple objet?
Il y a quelques raisons pour lesquelles je préfère utiliser Map
s plutôt que des objets simples ({}
) Pour stocker des données d'exécution (caches, etc.):
.size
Me permet de savoir combien d'entrées existent dans cette carte;.clear()
, .forEach()
, etc;Tous les autres cas, comme le passage d'arguments de fonction, le stockage de configurations, etc., sont tous écrits à l'aide d'objets simples.
N'oubliez pas non plus: N'essayez pas d'optimiser votre code trop tôt. Ne perdez pas votre temps à faire des benchmarks d'objet simple vs Maps, sauf si votre projet souffre de problèmes de performances.
Je ne suis pas sûr de cela, mais je pense que les performances ne sont PAS une raison pour utiliser Maps. Jetez un œil à cette page jsperf mise à jour:
http://jsperf.com/es6-map-vs-object-properties/7
Il semble que (lorsqu'il s'agit au moins de chaînes) les objets soient beaucoup plus rapides que les cartes pour les réglages de base et l'obtention.
EDIT: cette réponse est désormais obsolète et erronée. Voir le flux de commentaires ci-dessous.
Les autres réponses ne mentionnent pas une dernière différence entre les objets et Map
s:
L'objet
Map
contient des paires clé-valeur et se souvient de l'ordre d'insertion d'origine des clés .Ainsi, lors de son itération, un objet Map renvoie les clés par ordre d'insertion.
Citation de MDN , accent le mien
C'est la principale raison pour laquelle j'ai décidé d'utiliser Map
pour la première fois dans un projet récent. J'avais un objet normal que je devais afficher dans un <table>
, chaque propriété se trouvant dans une ligne spécifique.
let productPropertyOrder = [ "name", "weight", "price", "stocked" ];
let product =
{
name: "Lasagne",
weight: "1kg",
price: 10,
stocked: true
}
J'ai écrit une fonction pour transformer un objet en Map
selon un ordre de clé souhaité:
Remarque: cette fonction supprime toutes les propriétés des objets introuvables dans
order
function objectToMap( obj, order )
{
let map = new Map();
for ( const key of order )
{
if ( obj.hasOwnProperty( key ) )
{
map.set( key, obj[ key ] );
}
}
return map;
}
Ensuite, la carte peut être itérée dans l'ordre souhaité:
let productMap = objectToMap( product, productPropertyOrder );
for ( const value of productMap.values() )
{
let cell = document.createElement( "td" );
cell.innerText = value;
row.appendChild( cell );
}
Bien sûr, c'est un peu artificiel car on pourrait tout aussi bien afficher lors de l'itération sur l'ordre des propriétés sans créer un Map
dans le processus:
for ( const key of productPropertyOrder )
{
if ( product.hasOwnProperty( key ) )
{
let value = product[ key ];
// create cell
}
}
Mais si vous avez un tableau de ces objets et que vous allez les afficher à de nombreux endroits, les convertir tous en cartes est tout d'abord logique.