Utilisez des cartes sur des objets lorsque les clés sont inconnues jusqu'au moment de l'exécution et lorsque toutes les clés sont du même type et toutes les valeurs sont du même type.
Utilisez des objets lorsqu'il existe une logique qui opère sur des éléments individuels.
Quel est un exemple d'application de l'utilisation de cartes sur des objets? en particulier, "quand les clés seraient-elles inconnues jusqu'au moment de l'exécution?"
var myMap = new Map();
var keyObj = {},
keyFunc = function () { return 'hey'},
keyString = "a string";
// setting the values
myMap.set(keyString, "value associated with 'a string'");
myMap.set(keyObj, "value associated with keyObj");
myMap.set(keyFunc, "value associated with keyFunc");
console.log(myMap.get(keyFunc));
Quel est un exemple d'application de l'utilisation de cartes sur des objets?
Je pense que vous avez déjà donné un bon exemple: vous devez au moins utiliser Map
s lorsque vous utilisez des objets (y compris des objets Function) comme clés.
en particulier, "quand les clés seraient-elles inconnues jusqu'au moment de l'exécution?"
Chaque fois qu'ils ne sont pas connus au moment de la compilation. En bref, vous devriez toujours utiliser une Map
lorsque vous avez besoin d'une clé-valeur collection . Un bon indicateur de la nécessité d'une collection consiste à ajouter et à supprimer des valeurs de la collection de manière dynamique, notamment lorsque vous ne les connaissez pas au préalable (par exemple, elles sont lues dans une base de données, entrées par l'utilisateur, etc.).
En revanche, vous devez utiliser des objets lorsque vous savez quelles sont les propriétés de l'objet et combien de celles-ci lors de l'écriture du code, et lorsque leur forme est statique. Comme @Felix l'a dit: quand vous avez besoin d'un record . Un bon indicateur de cette nécessité est lorsque les champs ont différents types et lorsque vous n’avez jamais besoin d’utiliser la notation entre crochets (ou d’attendre un ensemble limité de noms de propriété dans celle-ci).
Je pense qu'avec Map
d'ES2015, il ne reste plus que deux raisons d'utiliser des objets simples:
Quand l'ordre de propriété est-il sans importance?
Promise
- qui est un proxy pour une valeur future - et then
/catch
)Dans tous les autres cas, vous pouvez envisager d'utiliser Map
, car il conserve l'ordre des propriétés et sépare le programme (toutes les propriétés affectées à l'objet Map
) du niveau de données (toutes les entrées de la variable Map
elle-même).
Quels sont les inconvénients de Map
?
Utilisez des mappes sur des objets lorsque les clés sont inconnues jusqu'au moment de l'exécution, lorsque toutes les clés sont du même type et que toutes les valeurs sont du même type.
Je ne sais pas pourquoi quelqu'un écrirait quelque chose de si manifestement faux. Je dois dire que de nos jours, les gens trouvent de plus en plus de contenu faux et/ou discutable sur MDN.
Rien dans cette phrase n'est correct. La principale raison d'utiliser des cartes est lorsque vous souhaitez des clés à valeur d'objet. L'idée que les valeurs doivent être du même type est absurde - bien qu'elles puissent l'être, bien sûr. L'idée de ne pas utiliser d'objets lorsque les clés sont inconnues jusqu'au moment de l'exécution est également absurde.
Une des différences entre Map
et Object
est la suivante:
Map
peut utiliser un type de données complexe comme clé. comme ça:
const fn = function() {}
const m = new Map([[document.body, 'stackoverflow'], [fn, 'redis']]);
m.get(document.body) // 'stackoverflow'
m.get(fn) //'redis'
surveillez: Pour les types de données complexes, si vous voulez obtenir la valeur, vous devez transmettre la même référence que la clé.
Object
, il n'accepte que le type de données simple (number
, string
) comme clé.
const a = {};
a[document.body] = 'stackoverflow';
console.log(a) //{[object HTMLBodyElement]: "stackoverflow"}
Cette question est une copie de mais jusqu'à ce qu'elle soit fermée, voici ma réponse de là-bas :
En plus des autres réponses, j'ai constaté que les cartes sont plus difficiles à manier et plus compliquées à utiliser que les objets.
obj[key] += x
// vs.
map.set(map.get(key) + x)
Ceci est important car un code plus court est plus rapide à lire, plus directement expressif et mieux gardé dans la tête du programmeur .
Un autre aspect: parce que set () renvoie la carte, pas la valeur, il est impossible de chaîner les affectations.
foo = obj[key] = x; // Does what you expect
foo = map.set(key, x) // foo !== x; foo === map
Le débogage de cartes est également plus douloureux. En dessous, vous ne pouvez pas voir quelles clés sont sur la carte. Il faudrait écrire du code pour le faire.
Les objets peuvent être évalués par n'importe quel IDE:
Object
s sont similaires à Map
s dans la mesure où ils vous permettent de définir des clés, de récupérer ces valeurs, de supprimer des clés et de détecter si quelque chose est stocké dans une clé. Pour cette raison (et parce qu'il n'y avait pas d'alternative intégrée), Object
s a été utilisé comme Map
s par le passé; Cependant, il existe des différences importantes qui rendent préférable d'utiliser Map
dans certains cas:
Object
sont String
s et Symbol
s, alors qu'elles peuvent être N'importe quelle valeur pour une Map
, y compris les fonctions, les objets et toute primitive.Map
sont ordonnées alors que les clés ajoutées à object ne le sont pas. Ainsi, En itérant dessus, un objet Map
renvoie les clés dans l’ordre de Insertion.Map
avec la propriété size
, tandis que le nombre de propriétés dans Object
doit être déterminé manuellement.Map
est un itératif et peut donc être directement itéré, alors que Itérer sur un Object
nécessite d'obtenir ses clés d'une manière ou d'une autre Et de les parcourir plusieurs fois.Object
a un prototype, il y a donc des clés par défaut dans la carte qui Pourraient entrer en collision avec vos clés si vous ne faites pas attention. À partir de ES5, ceci Peut être contourné en utilisant map = Object.create(null)
, mais c'est rarement le cas Map
peut donner de meilleurs résultats dans les scénarios impliquant l’ajout fréquent et la suppression de paires de clés.