Verwenden Sie Karten über Objekten, wenn Schlüssel bis zur Laufzeit unbekannt sind und wenn alle Schlüssel vom gleichen Typ und alle Werte vom gleichen Typ sind.
Verwenden Sie Objekte, wenn es eine Logik gibt, die einzelne Elemente bearbeitet.
Frage:
Was ist ein anwendbares Beispiel für die Verwendung von Karten über Objekten? insbesondere "Wann wären Schlüssel bis zur Laufzeit unbekannt?"
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));
javascript
ecmascript-6
javascript-objects
Matthew Harwood
quelle
quelle
WeakMap
, die auch hilfreich sein könnte.name
undid
zum Beispiel.Antworten:
Ich denke, Sie haben bereits ein gutes Beispiel gegeben: Sie müssen zumindest
Map
s verwenden, wenn Sie Objekte (einschließlich Funktionsobjekte) als Schlüssel verwenden.Wann immer sie zur Kompilierungszeit nicht bekannt sind. Kurz gesagt, sollten Sie immer ein verwenden ,
Map
wenn Sie einen benötigen Schlüssel-Wert - Sammlung . Ein guter Indikator dafür, dass Sie eine Sammlung benötigen, ist das dynamische Hinzufügen und Entfernen von Werten zur Sammlung, insbesondere wenn Sie diese Werte vorher nicht kennen (z. B. werden sie aus einer Datenbank gelesen, vom Benutzer eingegeben usw.).Im Gegensatz dazu sollten Sie Objekte verwenden, wenn Sie wissen, welche und wie viele Eigenschaften das Objekt beim Schreiben des Codes hat - wenn ihre Form statisch ist. Wie @Felix es ausgedrückt hat: wenn Sie einen Datensatz benötigen . Ein guter Indikator für die Notwendigkeit ist, wenn die Felder unterschiedliche Typen haben und Sie niemals die Klammernotation verwenden müssen (oder eine begrenzte Anzahl von Eigenschaftsnamen darin erwarten müssen).
quelle
for..of
) anstelle der Programmebene (z . B.for..in
) durchlaufen müssen, verwenden Sie aMap
. Weitere Informationen zu diesen Bedingungen finden Sie in dieser Antwort .Ich denke, dass mit ES2015
Map
nur noch zwei Gründe übrig bleiben, einfache Objekte zu verwenden:Wann ist die Immobilienbestellung unwichtig?
Promise
- das ist ein Proxy für einen zukünftigen Wert - undthen
/catch
)In allen anderen Fällen können Sie die Verwendung in Betracht ziehen
Map
, da die Eigenschaftsreihenfolge beibehalten und das Programm (alle demMap
Objekt zugewiesenen Eigenschaften ) von der Datenebene (alle Einträge in sichMap
selbst) getrennt wird.Was sind die Nachteile von
Map
?quelle
Map
ist wahrscheinlich schneller, weil es nur auf einem Hash basiert, währendObject
es etwas komplizierter ist. Vielen Dank!Ich habe keine Ahnung, warum jemand etwas so offensichtlich Falsches schreiben würde. Ich muss sagen, die Leute finden heutzutage immer mehr falsche und / oder fragwürdige Inhalte auf MDN.
Nichts in diesem Satz ist richtig. Der Hauptgrund für die Verwendung von Karten liegt darin, dass Sie Schlüssel mit Objektwerten möchten. Die Idee, dass die Werte vom gleichen Typ sein sollten, ist absurd - obwohl dies natürlich der Fall sein könnte. Die Idee, dass man Objekte nicht verwenden sollte, wenn Schlüssel bis zur Laufzeit unbekannt sind, ist ebenso absurd.
quelle
Map
guter Rat ist , keine Objekte mehr für Sammlungen zu verwenden (wenn verfügbar).Einer der Unterschiede zwischen
Map
undObject
ist:Map
kann einen komplexen Datentyp als Schlüssel verwenden. so was:Achtung: Bei komplexen Datentypen müssen Sie dieselbe Referenz wie der Schlüssel übergeben, wenn Sie den Wert erhalten möchten.
Object
akzeptiert es nur den einfachen Datentyp (number
,string
) als Schlüssel.quelle
Diese Frage ist ein Duplikat von aber bis es geschlossen ist, hier ist meine Antwort von dort drüben :
Zusätzlich zu den anderen Antworten habe ich festgestellt, dass Karten unhandlicher und ausführlicher zu handhaben sind als Objekte.
Dies ist wichtig, da kürzerer Code schneller zu lesen, direkter auszudrücken und besser im Kopf des Programmierers bleibt .
Ein weiterer Aspekt: Da set () die Karte und nicht den Wert zurückgibt, ist es unmöglich, Zuordnungen zu verketten.
Das Debuggen von Karten ist auch schmerzhafter. Unten können Sie nicht sehen, welche Schlüssel sich auf der Karte befinden. Sie müssten Code schreiben, um das zu tun.
Objekte können von jeder IDE ausgewertet werden:
quelle
Object
s sind s insofern ähnlichMap
, als Sie mit beiden Schlüssel auf Werte setzen, diese Werte abrufen, Schlüssel löschen und erkennen können, ob etwas an einem Schlüssel gespeichert ist. Aus diesem Grund (und weil es keine eingebauten Alternativen gab) wurdenObject
s alsMap
s historisch verwendet; Es gibt jedoch wichtige Unterschiede, die die Verwendung einesMap
in bestimmten Fällen vorzuziehen machen :Object
sindString
s undSymbol
s, während sie ein beliebiger Wert für a sein könnenMap
, einschließlich Funktionen, Objekte und beliebiger Grundelemente.Map
werden sortiert, die zum Objekt hinzugefügten Schlüssel nicht. Wenn einMap
Objekt darüber iteriert, gibt es die Schlüssel in der Reihenfolge des Einfügens zurück.Map
einfach mit dersize
Eigenschaft ermitteln, während die Anzahl der Eigenschaften in einemObject
manuell ermittelt werden muss.Map
ist iterierbar und kann daher direkt iteriert werden, wohingegen das Iterieren über a dasObject
Erhalten seiner Schlüssel auf irgendeine Weise und das Iterieren über sie erfordert.Object
hat einen Prototyp, daher gibt es Standardschlüssel in der Karte, die mit Ihren Schlüsseln kollidieren können, wenn Sie nicht vorsichtig sind. Ab ES5 kann dies mit umgangen werdenmap = Object.create(null)
, dies wird jedoch selten durchgeführt.Map
kann in Szenarien mit häufigem Hinzufügen und Entfernen von Schlüsselpaaren eine bessere Leistung erzielen.MDN
quelle