Get to know MDN better
Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.
Diese Funktion ist gut etabliert und funktioniert auf vielen Geräten und in vielen Browserversionen. Sie ist seit Juli 2015 browserübergreifend verfügbar.
* Einige Teile dieser Funktion werden möglicherweise unterschiedlich gut unterstützt.
Das Map-Objekt hält Schlüssel-Wert-Paare und merkt sich die ursprüngliche Einfügereihenfolge der Schlüssel. Jeder Wert (sowohl Objekte als auch primitive Werte) kann sowohl als Schlüssel als auch als Wert verwendet werden.
Map-Objekte sind Sammlungen von Schlüssel-Wert-Paaren. Ein Schlüssel in der Map kann nur einmal vorkommen; er ist einzigartig in der Sammlung der Map. Ein Map-Objekt wird durch Schlüssel-Wert-Paare iteriert — eine for...of Schleife gibt ein Array mit zwei Elementen [key, value] für jede Iteration zurück. Die Iteration erfolgt in Einfügereihenfolge, was der Reihenfolge entspricht, in der jedes Schlüssel-Wert-Paar erstmals mittels der set()-Methode in die Karte eingefügt wurde (das heißt, es gab keinen Schlüssel mit demselben Wert, als set() aufgerufen wurde).
Die Spezifikation erfordert, dass Maps so implementiert werden, dass sie im Durchschnitt Zugriffszeiten bieten, die sublinear zur Anzahl der Elemente in der Sammlung sind. Daher könnte sie intern als Hash-Tabelle (mit O(1) Suchzeit), Suchbaum (mit O(log(N)) Suchzeit) oder einer anderen Datenstruktur dargestellt werden, solange die Komplexität besser als O(N) ist.
Die Gleichheit der Werte basiert auf dem SameValueZero-Algorithmus. (Früher wurde SameValue verwendet, das 0 und -0 als unterschiedlich behandelte. Prüfen Sie die Browser-Kompatibilität.) Das bedeutet, dass NaN als gleich NaN angesehen wird (obwohl NaN !== NaN) und alle anderen Werte als gleich gemäß den Semantiken des === Operators betrachtet werden. Bei Objektschlüsseln basiert die Gleichheit auf der Objektidentität. Sie werden durch Referenz verglichen, nicht durch Wert. Siehe Verwendung des Map-Objekts für Beispiele.
Object ist ähnlich wie Map — beide erlauben das Setzen von Schlüsseln zu Werten, das Abrufen dieser Werte, das Löschen von Schlüsseln und das Erkennen, ob etwas unter einem Schlüssel gespeichert ist. Aus diesem Grund (und da es keine eingebauten Alternativen gab) wurde Object historisch als Map verwendet.
Es gibt jedoch wichtige Unterschiede, die Map in einigen Fällen bevorzugt machen:
| Eine Map enthält standardmäßig keine Schlüssel. Sie enthält nur das, was explizit hineingesteckt wird. |
Ein Object hat einen Prototyp, daher enthält es Standardschlüssel, die mit Ihren eigenen Schlüsseln kollidieren könnten, wenn Sie nicht vorsichtig sind. Hinweis: Dies kann umgangen werden, indem Object.create(null) verwendet wird, aber das wird selten gemacht. |
| Eine Map ist sicher für die Verwendung mit benutzerdefinierten Schlüsseln und Werten. |
Das Setzen von benutzerdefinierten Schlüssel-Wert-Paaren auf einem Object kann einem Angreifer erlauben, den Prototyp des Objekts zu überschreiben, was zu Objektinjektionsangriffen oder Prototypverschmutzungsangriffen führen kann. Wie das Problem der zufälligen Schlüssel kann dies auch durch die Verwendung eines Objekts mit null-Prototypen abgemildert werden. |
| Die Schlüssel einer Map können beliebige Werte sein (einschließlich Funktionen, Objekte oder beliebige Primitive). | Die Schlüssel eines Object müssen entweder ein String oder ein Symbol sein. |
|
Die Schlüssel in Map sind in einer geradlinigen Weise angeordnet: Ein Map-Objekt iteriert Einträge, Schlüssel und Werte in der Reihenfolge der Eingabeneinfügung. |
Obwohl die Schlüssel eines gewöhnlichen Object jetzt in Ordnung gebracht werden, war dies nicht immer der Fall, und die Reihenfolge ist komplex. Daher ist es am besten, sich nicht auf die Eigenschaftsreihenfolge zu verlassen. Die Reihenfolge wurde erstmals für eigene Eigenschaften in ECMAScript 2015 definiert; ECMAScript 2020 definiert die Reihenfolge auch für geerbte Eigenschaften. Beachten Sie jedoch, dass kein einziger Mechanismus alle Eigenschaften eines Objekts iteriert; die verschiedenen Mechanismen beinhalten jeweils unterschiedliche Teilmengen von Eigenschaften. (for-in schließt nur aufzählbare Eigenschaften mit String-Schlüssel ein; Object.keys schließt nur eigene, aufzählbare, mit String-Schlüssen versehene Eigenschaften ein; Object.getOwnPropertyNames schließt eigene, mit String-Schlüssen versehene Eigenschaften ein, auch wenn sie nicht aufzählbar sind; Object.getOwnPropertySymbols tut dasselbe nur für mit Symbol-Schlüsseln versehene Eigenschaften usw.) |
| Die Anzahl der Elemente in einer Map lässt sich einfach über ihre size-Eigenschaft abrufen. | Die Bestimmung der Anzahl der Elemente in einem Object ist umständlicher und weniger effizient. Eine gängige Methode ist die Nutzung der length des von Object.keys() zurückgegebenen Arrays. |
| Eine Map ist iterierbar, so dass sie direkt iteriert werden kann. |
Object implementiert kein Iterationsprotokoll und ist daher standardmäßig nicht direkt mit der JavaScript for...of Schleife iterierbar. Hinweis:
|
|
Bessere Leistung in Szenarien mit häufigem Hinzufügen und Entfernen von Schlüssel-Wert-Paaren. |
Nicht für häufiges Hinzufügen und Entfernen von Schlüssel-Wert-Paaren optimiert. |
|
Keine native Unterstützung für Serialisierung oder Parsing. (Aber Sie können Ihre eigene Serialisierung und Parsing-Unterstützung für Map erstellen, indem Sie JSON.stringify() mit seinem Replacer Argument und JSON.parse() mit seinem Reviver Argument verwenden. Siehe die Stack Overflow Frage How do you JSON.stringify an ES6 Map?). |
Nativer Support für die Serialisierung von Object zu JSON mit JSON.stringify(). Nativer Support für das Parsing von JSON zu Object mit JSON.parse(). |
Das Setzen von Objekt-Eigenschaften funktioniert auch bei Map-Objekten und kann erhebliche Verwirrung verursachen.
Daher scheint es auf diese Weise zu funktionieren:
Aber diese Art, eine Eigenschaft zu setzen, interagiert nicht mit der Map-Datenstruktur. Es nutzt die Funktion des generischen Objekts. Der Wert von 'bla' wird nicht in der Map für Abfragen gespeichert. Andere Operationen auf den Daten schlagen fehl:
Die korrekte Verwendung zum Speichern von Daten in der Map erfolgt über die set(key, value)-Methode.
Browser Map-ähnliche Objekte (oder "kartenähnliche Objekte") sind Web-API-Schnittstellen, die sich in vielerlei Hinsicht wie eine Map verhalten.
Genau wie Map können die Einträge in derselben Reihenfolge iteriert werden, in der sie dem Objekt hinzugefügt wurden. Map-ähnliche Objekte und Map haben auch Eigenschaften und Methoden, die denselben Namen und das gleiche Verhalten teilen. Anders als bei Map erlauben sie jedoch nur bestimmte vordefinierte Typen für die Schlüssel und Werte jedes Eintrags.
Die erlaubten Typen sind in der Spezifikation-IDL-Definition festgelegt. Beispielsweise ist RTCStatsReport ein Map-ähnliches Objekt, das Strings für Schlüssel und Objekte für Werte verwenden muss. Dies ist in der Spezifikation-IDL unten definiert:
Map-ähnliche Objekte sind entweder schreibgeschützt oder schreibbar (siehe das readonly Schlüsselwort in der obigen IDL).
Die Methoden und Eigenschaften haben das gleiche Verhalten wie die gleichwertigen Entitäten in Map, abgesehen von der Einschränkung der Typen der Schlüssel und Werte.
Die folgenden sind Beispiele für schreibgeschützte Map-ähnliche Browser-Objekte:
Erstellt ein neues Map-Objekt.
Die Konstruktionsfunktion, die verwendet wird, um abgeleitete Objekte zu erstellen.
Gruppiert die Elemente eines gegebenen Iterables unter Verwendung der von einer bereitgestellten Callback-Funktion zurückgegebenen Werte. Die endgültige zurückgegebene Map verwendet die eindeutigen Werte der Testfunktion als Schlüssel, die verwendet werden können, um das Array von Elementen in jeder Gruppe zu erhalten.
Diese Eigenschaften sind auf Map.prototype definiert und werden von allen Map-Instanzen geteilt.
Map.prototype.constructorDie Konstruktionsfunktion, die das Instanzobjekt erstellt hat. Bei Map-Instanzen ist der Anfangswert der Map-Konstruktor.
Map.prototype.sizeGibt die Anzahl der Schlüssel-/Wert-Paare im Map-Objekt zurück.
Map.prototype[Symbol.toStringTag]Der Anfangswert der [Symbol.toStringTag]-Eigenschaft ist der String "Map". Diese Eigenschaft wird in Object.prototype.toString() verwendet.
Entfernt alle Schlüssel-Wert-Paare aus dem Map-Objekt.
Map.prototype.delete()Entfernt den durch den Schlüssel angegebenen Eintrag aus dieser Map.
Map.prototype.entries()Gibt ein neues Iterator-Objekt zurück, das ein Zwei-Elemente-Array von [key, value] für jedes Element im Map-Objekt in Einfügereihenfolge enthält.
Map.prototype.forEach()Ruft callbackFn einmal für jedes im Map-Objekt vorhandene Schlüssel-Wert-Paar in Einfügereihenfolge auf. Wenn ein thisArg-Parameter an forEach übergeben wird, wird er als diese this-Wert für jeden Callback verwendet.
Map.prototype.get()Gibt den Wert zurück, der dem Schlüssel in dieser Map entspricht, oder undefined, wenn keiner vorhanden ist.
Map.prototype.getOrInsert()Gibt den Wert zurück, der dem angegebenen Schlüssel in dieser Map entspricht. Wenn der Schlüssel nicht vorhanden ist, wird ein neuer Eintrag mit dem Schlüssel und einem gegebenen Standardwert eingefügt und der eingefügte Wert zurückgegeben.
Map.prototype.getOrInsertComputed()Gibt den Wert zurück, der dem angegebenen Schlüssel in dieser Map entspricht. Wenn der Schlüssel nicht vorhanden ist, wird ein neuer Eintrag mit dem Schlüssel und einem Standardwert eingefügt, der aus einem gegebenen Callback berechnet wird, und der eingefügte Wert wird zurückgegeben.
Map.prototype.has()Gibt einen booleanischen Wert zurück, der angibt, ob ein Eintrag mit dem angegebenen Schlüssel in dieser Map existiert oder nicht.
Map.prototype.keys()Gibt ein neues Iterator-Objekt zurück, das die Schlüssel für jedes Element im Map-Objekt in Einfügereihenfolge enthält.
Map.prototype.set()Fügt dieser Map einen neuen Eintrag mit einem angegebenen Schlüssel und Wert hinzu oder aktualisiert einen vorhandenen Eintrag, wenn der Schlüssel bereits existiert.
Map.prototype.values()Gibt ein neues Iterator-Objekt zurück, das die Werte für jedes Element im Map-Objekt in Einfügereihenfolge enthält.
Map.prototype[Symbol.iterator]()Gibt ein neues Iterator-Objekt zurück, das ein Zwei-Elemente-Array von [key, value] für jedes Element im Map-Objekt in Einfügereihenfolge enthält.
NaN kann ebenfalls als Schlüssel verwendet werden. Obwohl jedes NaN nicht gleich sich selbst ist (NaN !== NaN ist wahr), funktioniert das folgende Beispiel, da NaNs nicht voneinander zu unterscheiden sind:
Maps können mit einer for...of Schleife iteriert werden:
Maps können mit der forEach()-Methode iteriert werden:
Genauso wie Arrays können Maps geklont werden:
Hinweis: Beachten Sie, dass die Daten selbst nicht geklont werden. Mit anderen Worten, es handelt sich nur um eine flache Kopie der Map.
Maps können zusammengeführt werden, wobei die Eindeutigkeit der Schlüssel beibehalten wird:
Maps können auch mit Arrays zusammengeführt werden:
| ECMAScript® 2027 Language Specification # sec-map-objects |
JavaScript aktivieren, um diese Browser-Kompatibilitätstabelle anzuzeigen.
Der Bauplan für ein besseres Internet.
Besuche die gemeinnützige Muttergesellschaft der Mozilla Corporation, die Mozilla Foundation.
Teile dieses Inhalts sind ©1998–2026 von einzelnen mozilla.org-Mitwirkenden. Inhalte sind verfügbar unter einer Creative-Commons-Lizenz.