Ich habe gerade chromestatus.com entdeckt und nach einigen Stunden meines Tages diesen Funktionseintrag gefunden :
Karte: Kartenobjekte sind einfache Schlüssel- / Wertekarten.
Das hat mich verwirrt. Normale JavaScript-Objekte sind Wörterbücher. Wie Map
unterscheidet sich ein Wörterbuch von einem Wörterbuch? Konzeptionell sind sie identisch (gemäß Was ist der Unterschied zwischen einer Karte und einem Wörterbuch? )
Die Dokumentation chromestatus Referenzen hilft auch nicht:
Kartenobjekte sind Sammlungen von Schlüssel / Wert-Paaren, bei denen sowohl die Schlüssel als auch die Werte beliebige ECMAScript-Sprachwerte sein können. Ein eindeutiger Schlüsselwert darf nur in einem Schlüssel / Wert-Paar in der Map-Sammlung vorkommen. Unterscheiden Sie Schlüsselwerte, die mithilfe eines Vergleichsalgorithmus unterschieden werden, der beim Erstellen der Karte ausgewählt wird.
Ein Map-Objekt kann seine Elemente in Einfügereihenfolge durchlaufen. Das Kartenobjekt muss entweder mithilfe von Hash-Tabellen oder anderen Mechanismen implementiert werden, die im Durchschnitt Zugriffszeiten bereitstellen, die sublinear zur Anzahl der Elemente in der Sammlung sind. Die in dieser Map-Objektspezifikation verwendeten Datenstrukturen sollen nur die erforderliche beobachtbare Semantik von Map-Objekten beschreiben. Es soll kein tragfähiges Implementierungsmodell sein.
… Klingt für mich immer noch wie ein Objekt, also habe ich eindeutig etwas verpasst.
Warum erhält JavaScript ein (gut unterstütztes) Map
Objekt? Was tut es?
Antworten:
Laut Mozilla:
und
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map
Die Iterierbarkeit in der richtigen Reihenfolge ist eine Funktion, die von Entwicklern seit langem gewünscht wird, auch weil sie in allen Browsern die gleiche Leistung gewährleistet. Für mich ist das eine große Sache.
Die
myMap.has(key)
Methode wird besonders praktisch sein, und auch diemyMap.size
Eigenschaft.quelle
map = Object.create(null)
. Was sind Standardschlüssel? Wie hängen Schlüssel zusammenObject.prototype
?new
Operator mit demMap
Symbol verwendet werden, dhnew Map
um ein Kartenobjekt zu erstellen.var a = {}
ist eine Abkürzung für (bedeutet äquivalent zu)var a = Object.create(Object.prototype)
Der Hauptunterschied besteht darin, dass Objekte nur Zeichenfolgenschlüssel unterstützen, während Maps mehr oder weniger jeden Schlüsseltyp unterstützen.
Wenn ich das tue
obj[123] = true
und dannObject.keys(obj)
werde ich["123"]
eher als bekommen[123]
. Eine Karte würde den Typ des Schlüssels beibehalten und zurückkehren,[123]
was großartig ist. Mit Karten können Sie auch Objekte als Schlüssel verwenden. Um dies zu tun, müsste man Objekten traditionell eine eindeutige Kennung geben, um sie zu hashen (ich glaube nicht, dass ich jemals so etwas wiegetObjectId
in JS als Teil des Standards gesehen habe). Karten garantieren auch die Aufrechterhaltung der Ordnung, sind also rundum besser für die Erhaltung und können Ihnen manchmal ersparen, dass Sie einige Sortierungen vornehmen müssen.Zwischen Karten und Objekten gibt es in der Praxis mehrere Vor- und Nachteile. Objekte haben sowohl Vor- als auch Nachteile, da sie sehr eng in den Kern von JavaScript integriert sind, wodurch sie sich von Map deutlich über den Unterschied in der Schlüsselunterstützung hinaus unterscheiden.
Ein unmittelbarer Vorteil besteht darin, dass Sie Objekte syntaktisch unterstützen, um den Zugriff auf Elemente zu vereinfachen. Sie haben auch direkte Unterstützung für JSON. Wenn es als Hash verwendet wird, ist es ärgerlich, ein Objekt ohne Eigenschaften zu erhalten. Wenn Sie Objekte als Hash-Tabelle verwenden möchten, werden sie standardmäßig verschmutzt, und Sie müssen sie häufig aufrufen
hasOwnProperty
, wenn Sie auf Eigenschaften zugreifen. Hier können Sie sehen, wie Objekte standardmäßig verschmutzt werden und wie hoffentlich nicht verschmutzte Objekte zur Verwendung als Hashes erstellt werden:Verschmutzung von Objekten macht Code nicht nur ärgerlicher, langsamer usw., sondern kann auch potenzielle Konsequenzen für die Sicherheit haben.
Objekte sind keine reinen Hash-Tabellen, sondern versuchen, mehr zu tun. Sie haben Kopfschmerzen wie
hasOwnProperty
, nicht in der Lage zu sein, die Länge leicht zu bekommen (Object.keys(obj).length
) und so weiter. Objekte sind nicht nur als Hash-Maps gedacht, sondern auch als dynamisch erweiterbare Objekte. Wenn Sie sie also als reine Hash-Tabellen verwenden, treten Probleme auf.Vergleich / Liste verschiedener gängiger Operationen:
Es gibt einige andere Optionen, Ansätze, Methoden usw. mit unterschiedlichen Höhen und Tiefen (Leistung, knapp, tragbar, erweiterbar usw.). Objekte sind etwas seltsam, da sie den Kern der Sprache bilden. Sie haben also viele statische Methoden, um mit ihnen zu arbeiten.
Neben dem Vorteil, dass Karten Schlüsseltypen beibehalten und Objekte wie Schlüssel unterstützen können, sind sie von den Nebenwirkungen isoliert, die Objekte häufig haben. Eine Karte ist ein reiner Hash. Es gibt keine Verwirrung darüber, gleichzeitig ein Objekt zu sein. Karten können auch einfach mit Proxy-Funktionen erweitert werden. Objekte haben derzeit eine Proxy-Klasse, aber die Leistung und die Speichernutzung sind schlecht. Tatsächlich erstellt das Erstellen eines eigenen Proxys, der so aussieht, als ob Map for Objects derzeit eine bessere Leistung als Proxy aufweist.
Ein wesentlicher Nachteil von Maps besteht darin, dass sie mit JSON nicht direkt unterstützt werden. Das Parsen ist möglich, hat jedoch mehrere Probleme:
Das oben Gesagte führt zu einem ernsthaften Leistungseinbruch und unterstützt auch keine String-Tasten. Die JSON-Codierung ist noch schwieriger und problematischer (dies ist einer von vielen Ansätzen):
Dies ist nicht so schlimm, wenn Sie nur Maps verwenden, aber Probleme haben, wenn Sie Typen mischen oder nicht skalare Werte als Schlüssel verwenden (nicht, dass JSON für diese Art von Problem perfekt ist, wie es ist, IE-Zirkelobjektreferenz). Ich habe es nicht getestet, aber es besteht die Möglichkeit, dass es die Leistung im Vergleich zu Stringify stark beeinträchtigt.
Andere Skriptsprachen haben häufig keine derartigen Probleme, da sie explizite nicht skalare Typen für Map, Object und Array haben. Webentwicklung ist oft ein Problem bei nicht skalaren Typen, bei denen Sie sich mit Dingen wie PHP-Zusammenführung von Array / Map mit Objekt unter Verwendung von A / M für Eigenschaften und JS-Zusammenführung von Map / Objekt mit Array-Erweiterung von M / O befassen müssen. Das Zusammenführen komplexer Typen ist der Fluch des Teufels für hochrangige Skriptsprachen.
Bisher sind dies hauptsächlich Probleme bei der Implementierung, aber auch die Leistung für grundlegende Operationen ist wichtig. Die Leistung ist auch komplex, da sie vom Motor und der Verwendung abhängt. Machen Sie meine Tests mit einem Körnchen Salz, da ich keinen Fehler ausschließen kann (ich muss mich beeilen). Sie sollten auch Ihre eigenen Tests durchführen, um zu bestätigen, dass meine nur sehr spezifische einfache Szenarien untersuchen, um nur einen groben Hinweis zu geben. Laut Tests in Chrome für sehr große Objekte / Karten ist die Leistung für Objekte aufgrund des Löschens schlechter, was anscheinend eher proportional zur Anzahl der Schlüssel als zu O (1) ist:
Chrome hat eindeutig einen starken Vorteil beim Abrufen und Aktualisieren, aber die Löschleistung ist schrecklich. Karten verbrauchen in diesem Fall eine winzige Menge mehr Speicher (Overhead), aber da nur ein Objekt / eine Karte mit Millionen von Schlüsseln getestet wird, wird die Auswirkung des Overheads für Karten nicht gut ausgedrückt. Mit der Speicherverwaltung scheinen Objekte auch früher frei zu werden, wenn ich das Profil richtig lese, was ein Vorteil zugunsten von Objekten sein könnte.
In Firefox ist dies für diesen speziellen Benchmark eine andere Geschichte:
Ich möchte sofort darauf hinweisen, dass das Löschen von Objekten in Firefox in diesem speziellen Benchmark keine Probleme verursacht. In anderen Benchmarks hat es jedoch Probleme verursacht, insbesondere wenn es wie in Chrome viele Schlüssel gibt. Karten sind in Firefox für große Sammlungen eindeutig überlegen.
Dies ist jedoch nicht das Ende der Geschichte. Was ist mit vielen kleinen Objekten oder Karten? Ich habe einen schnellen Benchmark durchgeführt, aber keinen erschöpfenden (Einstellen / Erhalten), der mit einer kleinen Anzahl von Schlüsseln in den obigen Operationen am besten funktioniert. Bei diesem Test geht es mehr um Speicher und Initialisierung.
Auch diese Zahlen variieren, aber im Grunde hat Object einen guten Vorsprung. In einigen Fällen ist der Vorsprung für Objekte gegenüber Karten extrem (~ 10-mal besser), aber im Durchschnitt war er etwa 2-3-mal besser. Es scheint, dass extreme Leistungsspitzen in beide Richtungen funktionieren können. Ich habe dies nur in Chrome und bei der Erstellung getestet, um die Speichernutzung und den Overhead zu profilieren. Ich war ziemlich überrascht zu sehen, dass in Chrome Karten mit einem Schlüssel etwa 30-mal mehr Speicher belegen als Objekte mit einem Schlüssel.
Zum Testen vieler kleiner Objekte mit allen oben genannten Vorgängen (4 Tasten):
In Bezug auf die Speicherzuordnung verhielten sich diese in Bezug auf Freigabe / GC gleich, aber Map verwendete fünfmal mehr Speicher. Bei diesem Test wurden 4 Schlüssel verwendet, wobei ich wie im letzten Test nur einen Schlüssel festgelegt habe, um die Reduzierung des Speicheraufwands zu erklären. Ich habe diesen Test einige Male durchgeführt und Map / Object sind für Chrome in Bezug auf die Gesamtgeschwindigkeit insgesamt mehr oder weniger gleichauf. In Firefox für kleine Objekte gibt es einen deutlichen Leistungsvorteil gegenüber Karten insgesamt.
Dies beinhaltet natürlich nicht die einzelnen Optionen, die stark variieren können. Ich würde keine Mikrooptimierung mit diesen Zahlen empfehlen. Was Sie daraus ziehen können, ist, dass Sie als Faustregel Karten für sehr große Schlüsselwertspeicher und Objekte für kleine Schlüsselwertspeicher stärker berücksichtigen sollten.
Darüber hinaus ist es die beste Strategie mit diesen beiden, es zu implementieren und es zuerst funktionieren zu lassen. Bei der Profilerstellung ist zu beachten, dass manchmal Dinge, von denen Sie nicht glauben, dass sie beim Betrachten langsam sind, aufgrund von Engine-Macken, wie sie beim Löschen von Objektschlüsseln auftreten, unglaublich langsam sein können.
quelle
Ich glaube nicht, dass die folgenden Punkte in den Antworten bisher erwähnt wurden, und ich dachte, dass sie erwähnenswert wären.
Karten können größer sein
In Chrom kann ich 16,7 Mio. Schlüssel / Wert - Paare mit
Map
vs. 11.1 Mio. mit einem regelmäßigen Objekt. Fast genau 50% mehr Paare mit aMap
. Beide belegen ungefähr 2 GB Speicher, bevor sie abstürzen, und ich denke, dies hängt möglicherweise mit der Speicherbeschränkung durch Chrom zusammen ( Bearbeiten : Ja, versuchen Sie, 2 zu füllen,Maps
und Sie erhalten jeweils nur 8,3 Millionen Paare, bevor es abstürzt). Sie können es selbst mit diesem Code testen (führen Sie sie separat und natürlich nicht gleichzeitig aus):Objekte haben bereits einige Eigenschaften / Schlüssel
Dieser hat mich schon mal gestolpert. Regelmäßige Objekte haben
toString
,constructor
,valueOf
,hasOwnProperty
,isPrototypeOf
und eine Reihe von anderen bereits vorhandenen Eigenschaften. Dies mag für die meisten Anwendungsfälle kein großes Problem sein, hat mir jedoch zuvor Probleme bereitet.Karten können langsamer sein:
Aufgrund des
.get
Funktionsaufrufaufwands und des Mangels an interner Optimierung kann Map für einige Aufgaben erheblich langsamer sein als ein einfaches altes JavaScript-Objekt.quelle
toString
,constructor
etc. (dh Ihre Schlüssel sind extrem unwahrscheinlich , kollidiert mit ihnen). Es ist einfacher, mit ihnen zu arbeiten - z. B. ist das Inkrementieren soobj[i] = (obj[i] || 0) + 1
, währendMap
es immermap.set(i, (map.get(i) || 0) + 1)
noch nicht so schlimm ist, aber es zeigt nur, wie die Dinge unnötig chaotisch werden können. Karten haben definitiv ihre Anwendungsfälle, aber oft reicht ein einfaches Objekt aus.toString
,constructor
(etc.) Objekteigenschaften durch das Schreibenobj = Object.create(null)
stattobj = {}
.Objekte können sich wie Wörterbücher verhalten, da Javascript dynamisch eingegeben wird, sodass Sie jederzeit Eigenschaften zu einem Objekt hinzufügen oder daraus entfernen können.
Die neue
Map()
Funktionalität ist jedoch viel besser, weil:get
,set
,has
, unddelete
Methoden.for-of
Verwendung und behält die Reihenfolge der Ergebnisse bei.In 99% der Fälle sollten Sie nur a verwenden
Map()
. Wenn Sie jedoch nur Zeichenfolgen-basierte Schlüssel verwenden und maximale Leseleistung benötigen, sind Objekte möglicherweise die bessere Wahl.Das Detail ist, dass (fast alle) Javascript-Engines Objekte im Hintergrund bis zu C ++ - Klassen kompilieren. Diese Typen werden zwischengespeichert und anhand ihrer "Gliederung" wiederverwendet. Wenn Sie also ein neues Objekt mit denselben genauen Eigenschaften erstellen, verwendet die Engine eine vorhandene Hintergrundklasse erneut. Der Zugriffspfad für Eigenschaften dieser Klassen ist sehr optimiert und viel schneller als die Suche nach a
Map()
.Durch Hinzufügen oder Entfernen einer Eigenschaft wird die zwischengespeicherte Hintergrundklasse neu kompiliert, weshalb die Verwendung eines Objekts als Wörterbuch mit vielen Schlüsseladditionen und -löschungen sehr langsam ist, das Lesen und Zuweisen vorhandener Schlüssel ohne Änderung des Objekts jedoch sehr schnell erfolgt.
Wenn Sie also eine einmal lesbare Arbeitslast mit Zeichenfolgenschlüsseln haben, verwenden Sie ein
object
als spezialisiertes Hochleistungswörterbuch, aber für alles andere verwenden Sie einMap()
.quelle
get set has delete
etc. Funktionalität, es ist einfach nicht ganz so elegant (aber auch nicht schlecht). Inwiefern ist esMap
einfacher, Iterationen durchzuführen? Ich bin mir nicht sicher, ob ich zustimmen kann.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
Zusammenfassung:
Object
: Eine Datenstruktur, in der Daten als Schlüsselwertpaare gespeichert werden. In einem Objekt muss der Schlüssel eine Zahl, eine Zeichenfolge oder ein Symbol sein. Der Wert kann alles sein, also auch andere Objekte, Funktionen usw. Ein Objekt ist eine nicht geordnete Datenstruktur, dh die Reihenfolge des Einfügens von Schlüsselwertpaaren wird nicht gespeichertES6 Map
: Eine Datenstruktur, in der Daten als Schlüsselwertpaare gespeichert werden. In dem ein eindeutiger Schlüssel einem Wert zugeordnet ist . Sowohl der Schlüssel als auch der Wert können in einem beliebigen Datentyp vorliegen . Eine Karte ist eine iterierbare Datenstruktur. Dies bedeutet, dass die Reihenfolge der Einfügung gespeichert wird und wir auf die Elemente in z. B. einerfor..of
Schleife zugreifen könnenHauptunterschiede:
A
Map
ist geordnet und iterierbar, während ein Objekt nicht geordnet und nicht iterierbar istWir können jeden Datentyp als
Map
Schlüssel verwenden, während Objekte nur eine Zahl, eine Zeichenfolge oder ein Symbol als Schlüssel haben können.A
Map
erbt vonMap.prototype
. Dies bietet alle Arten von Dienstprogrammfunktionen und -eigenschaften, was die Arbeit mitMap
Objekten erheblich erleichtert.Beispiel:
Objekt:
Karte:
Quelle: MDN
quelle
-0
Maps können nicht nur in einer genau definierten Reihenfolge iteriert werden und beliebige Werte als Schlüssel verwenden (außer ), sondern auch aus folgenden Gründen nützlich sein:Die Spezifikation erzwingt, dass Kartenoperationen im Durchschnitt sublinear sind.
Jede nicht dumme Implementierung eines Objekts verwendet eine Hash-Tabelle oder ähnliches, sodass die Suche nach Eigenschaften im Durchschnitt wahrscheinlich konstant ist. Dann könnten Objekte sogar schneller sein als Karten. Dies ist jedoch in der Spezifikation nicht vorgeschrieben.
Objekte können unangenehme unerwartete Verhaltensweisen aufweisen.
Angenommen, Sie haben keine
foo
Eigenschaft für ein neu erstelltes Objekt festgelegtobj
, sodass Sie eineobj.foo
undefinierte Rückgabe erwarten . Könntefoo
aber eingebautes Eigentum von geerbt werdenObject.prototype
. Oder Sie versuchen,obj.foo
mithilfe einer Zuweisung zu erstellen , aber ein Setter wird ausgeführt,Object.prototype
anstatt Ihren Wert zu speichern.Karten verhindern solche Dinge. Nun, es sei denn, ein Skript bringt etwas durcheinander
Map.prototype
. UndObject.create(null)
würde auch funktionieren, aber dann verlieren Sie die einfache Objektinitialisierersyntax.quelle
Wann sollten Maps anstelle von einfachen JavaScript-Objekten verwendet werden?
Das einfache JavaScript-Objekt {key: 'value'} enthält strukturierte Daten. Ein einfaches JS-Objekt hat jedoch seine Grenzen:
Nur Zeichenfolgen und Symbole können als Schlüssel für Objekte verwendet werden. Wenn wir andere Dinge verwenden, z. B. Zahlen als Schlüssel eines Objekts, werden wir beim Zugriff auf diese Schlüssel sehen, dass diese Schlüssel implizit in Zeichenfolgen konvertiert werden, was dazu führt, dass wir die Konsistenz der Typen verlieren. const names = {1: 'one', 2: 'two'}; Object.keys (Namen); // ['1', '2']
Es besteht die Möglichkeit, dass ererbte Eigenschaften von Prototypen versehentlich überschrieben werden, indem JS-Bezeichner als Schlüsselnamen eines Objekts geschrieben werden (z. B. toString, Konstruktor usw.).
Ein anderes Objekt kann nicht als Schlüssel eines Objekts verwendet werden, daher können keine zusätzlichen Informationen für ein Objekt geschrieben werden, indem dieses Objekt als Schlüssel eines anderen Objekts geschrieben wird und der Wert dieses anderen Objekts die zusätzlichen Informationen enthält
Objekte sind keine Iteratoren
Die Größe eines Objekts kann nicht direkt bestimmt werden
Diese Einschränkungen von Objekten werden durch Karten gelöst, aber wir müssen Karten als Ergänzung für Objekte betrachten, anstatt sie zu ersetzen. Grundsätzlich ist Map nur ein Array von Arrays, aber wir müssen dieses Array von Arrays als Argument mit dem neuen Schlüsselwort an das Map-Objekt übergeben, da sonst nur für Arrays von Arrays die nützlichen Eigenschaften und Methoden von Map nicht verfügbar sind. Und denken Sie daran, dass Schlüssel-Wert-Paare innerhalb des Arrays von Arrays oder der Map nur durch Kommas getrennt werden dürfen, keine Doppelpunkte wie bei einfachen Objekten.
3 Tipps zur Entscheidung, ob Sie eine Karte oder ein Objekt verwenden möchten:
Verwenden Sie Zuordnungen über Objekte, wenn Schlüssel bis zur Laufzeit unbekannt sind, da Schlüssel, die durch Benutzereingaben oder unwissentlich gebildet wurden, den Code, der das Objekt verwendet, beschädigen können, wenn diese Schlüssel die geerbten Eigenschaften des Objekts überschreiben. Daher ist die Zuordnung in diesen Fällen sicherer. Verwenden Sie auch Karten, wenn alle Schlüssel vom gleichen Typ und alle Karten vom gleichen Typ sind.
Verwenden Sie Karten, wenn primitive Werte als Schlüssel gespeichert werden müssen.
Verwenden Sie Objekte, wenn Sie einzelne Elemente bearbeiten müssen.
Die Verwendung von Karten bietet folgende Vorteile:
1. Map akzeptiert jeden Schlüsseltyp und behält den Schlüsseltyp bei:
Wir wissen, dass JS den Schlüssel des Objekts implizit in eine Zeichenfolge umwandelt, wenn es sich nicht um eine Zeichenfolge oder ein Symbol handelt. Im Gegenteil, Map akzeptiert alle Arten von Schlüsseln: Zeichenfolge, Zahl, Boolescher Wert, Symbol usw. und Map behält den ursprünglichen Schlüsseltyp bei. Hier verwenden wir die Nummer als Schlüssel in einer Karte und es bleibt eine Nummer:
Innerhalb einer Karte können wir sogar ein ganzes Objekt als Schlüssel verwenden. Es kann vorkommen, dass wir einige objektbezogene Daten speichern möchten, ohne diese Daten im Objekt selbst anzuhängen, damit wir mit schlanken Objekten arbeiten können, aber einige Informationen über das Objekt speichern möchten. In diesen Fällen müssen wir Map verwenden, damit wir Object als Schlüssel und zugehörige Daten des Objekts als Wert festlegen können.
Der Nachteil dieses Ansatzes ist jedoch die Komplexität des Zugriffs auf den Wert per Schlüssel, da wir das gesamte Array durchlaufen müssen, um den gewünschten Wert zu erhalten.
Wir können dieses Problem lösen, indem wir keinen direkten Zugriff auf den Wert erhalten, indem wir eine geeignete Karte verwenden.
Wir hätten dies mit WeakMap tun können, müssen nur schreiben, const myMap = new WeakMap (). Die Unterschiede zwischen Map und WeakMap bestehen darin, dass WeakMap die Speicherbereinigung von Schlüsseln (hier Objekte) ermöglicht, um Speicherverluste zu vermeiden. WeakMap akzeptiert nur Objekte als Schlüssel und WeakMap hat die Anzahl der Methoden reduziert.
2. Map hat keine Einschränkung hinsichtlich der Schlüsselnamen:
Bei einfachen JS-Objekten können wir versehentlich vom Prototyp geerbte Eigenschaften überschreiben, was gefährlich sein kann. Hier überschreiben wir die toString () - Eigenschaft des Actor-Objekts:
Definieren wir nun ein fn isPlainObject (), um festzustellen, ob das angegebene Argument ein einfaches Objekt ist, und dieses fn verwendet die toString () -Methode, um es zu überprüfen:
Die Map unterliegt keinen Einschränkungen für die Schlüsselnamen. Wir können Schlüsselnamen wie toString, Konstruktor usw. verwenden. Hier hat das ActorMap-Objekt zwar eine Eigenschaft namens toString, aber die vom Prototyp des ActorMap-Objekts geerbte Methode toString () funktioniert einwandfrei.
Wenn wir eine Situation haben, in der Benutzereingaben Schlüssel erstellen, müssen wir diese Schlüssel in einer Karte anstelle eines einfachen Objekts verwenden. Dies liegt daran, dass der Benutzer möglicherweise einen benutzerdefinierten Feldnamen wie toString, Konstruktor usw. auswählt. Diese Schlüsselnamen in einem einfachen Objekt können möglicherweise den Code beschädigen, der dieses Objekt später verwendet. Die richtige Lösung besteht also darin, den Status der Benutzeroberfläche an eine Karte zu binden. Es gibt keine Möglichkeit, die Karte zu beschädigen:
3. Karte ist iterierbar:
Um die Eigenschaften eines einfachen Objekts zu iterieren, benötigen wir Object.entries () oder Object.keys (). Die Object.entries (plainObject) geben ein Array von Schlüsselwertpaaren zurück, die aus dem Objekt extrahiert wurden. Anschließend können wir diese Schlüssel und Werte zerstören und normale Schlüssel und Werte ausgeben.
Da Maps iterierbar sind, benötigen wir keine entry () -Methoden, um über eine Map zu iterieren und den Schlüssel zu zerstören. Das Wertearray kann direkt auf der Map ausgeführt werden, da in einer Map jedes Element als Array von Schlüsselwertpaaren lebt, die durch Kommas getrennt sind .
Außerdem gibt map.keys () einen Iterator über Schlüssel und map.values () einen Iterator über Werte zurück.
4. Wir können die Größe einer Karte leicht erkennen
Wir können die Anzahl der Eigenschaften in einem einfachen Objekt nicht direkt bestimmen. Wir benötigen einen Helfer fn wie Object.keys (), der ein Array mit Schlüsseln des Objekts zurückgibt. Mit der Eigenschaft length können wir dann die Anzahl der Schlüssel oder die Größe des einfachen Objekts ermitteln.
Bei Karten können wir jedoch mit der Eigenschaft map.size direkt auf die Größe der Karte zugreifen.
quelle
Diese beiden Tipps können Ihnen bei der Entscheidung helfen, ob Sie eine Karte oder ein Objekt verwenden möchten:
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 Maps für den Fall, dass primitive Werte als Schlüssel gespeichert werden müssen, da das Objekt jeden Schlüssel als Zeichenfolge behandelt, entweder als Zahlenwert, als booleschen Wert oder als einen anderen primitiven Wert.
Verwenden Sie Objekte, wenn es eine Logik gibt, die einzelne Elemente bearbeitet.
Quelle: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Keyed_Collections#Object_and_Map_compared
quelle
Dies ist eine kurze Möglichkeit für mich, mich daran zu erinnern: KOI
NaN
usw. sein. Sie werden verwendet===
, um zwischen Schlüsseln zu unterscheiden, mit einer AusnahmeNaN !== NaN
, die Sie jedochNaN
als Schlüssel verwenden können.[...map]
oder[...map.keys()]
hat eine bestimmte Reihenfolge.obj[key]
oderobj.a
(in einer Sprache,[]
und[]=
ist wirklich Teil der Schnittstelle). Karte hatget()
,set()
,has()
,delete()
usw. Beachten Sie, dass Sie verwenden können ,map[123]
sondern dass es als ein einfaches JS - Objekt verwendet.quelle
Laut Mozilla
Objekt gegen Karte in JavaScript kurz mit Beispielen.
Das Objekt folgt dem gleichen Konzept wie das der Karte, dh es wird ein Schlüssel-Wert-Paar zum Speichern von Daten verwendet. Es gibt jedoch geringfügige Unterschiede, die Map in bestimmten Situationen zu einem besseren Darsteller machen.
Map- ist eine Datenstruktur, die beim Speichern der Daten in Form von Paaren hilft. Das Paar besteht aus einem eindeutigen Schlüssel und einem dem Schlüssel zugeordneten Wert. Es hilft, Doppelspurigkeit zu vermeiden.
Hauptunterschiede
quelle