621 Stimmen

Karte vs Objekt in JavaScript

Ich habe gerade diese Funktion entdeckt:

Karte: Kartenobjekte sind einfache Schlüssel-/Wert-Karten.

Das hat mich verwirrt. Reguläre JavaScript-Objekte sind Wörterbücher, also wie unterscheidet sich eine Karte von einem Wörterbuch? Konzeptionell sind sie identisch (laut einer anderen Frage auf Stack Overflow)

Auch die Dokumentation hilft nicht weiter:

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 bestimmter Schlüsselwert darf nur in einem Schlüssel/Wert-Paar innerhalb der Sammlung der Karte vorkommen. Unterschiedliche Schlüsselwerte werden mit einem Vergleichsalgorithmus diskriminiert, der beim Erstellen der Karte ausgewählt wird.

Ein Kartenobjekt kann seine Elemente in Einfügereihenfolge durchlaufen. Das Kartenobjekt muss mit Hilfe von Hash-Tabellen oder anderen Mechanismen implementiert sein, die im Durchschnitt Zugriffszeiten bieten, die sublinear zur Anzahl der Elemente in der Sammlung sind. Die in dieser Spezifikation von Kartenobjekten verwendeten Datenstrukturen sollen nur die erforderlichen beobachtbaren Semantiken von Kartenobjekten beschreiben. Sie sind nicht als praktisches Implementierungsmodell gedacht.

...klingt für mich immer noch wie ein Objekt, also habe ich offensichtlich etwas übersehen.

Warum erhält JavaScript also ein (gut unterstütztes) Karte-Objekt? Was kann es?

9voto

akhtarvahid Punkte 8140

Laut Mozilla

Object vs. Map in JavaScript auf eine kurze Art und Weise mit Beispielen.

Object- folgt dem gleichen Konzept wie das von Map, d.h. die Verwendung von Schlüssel-Wert-Paaren zur Speicherung von Daten. Es gibt jedoch geringfügige Unterschiede, die Map in bestimmten Situationen zu einer besseren Leistung machen.

Map- ist eine Datenstruktur, die hilft, die Daten in Form von Paaren zu speichern. Das Paar besteht aus einem eindeutigen Schlüssel und einem dem Schlüssel zugeordneten Wert. Es hilft, die Duplizität zu verhindern.

Wesentliche Unterschiede

  • Die Map ist eine Instanz eines Objekts, aber nicht umgekehrt.

    var map = new Map(); var obj = new Object(); console.log(obj instanceof Map); // false console.log(map instanceof Object); // true

  • In Object ist der Datentyp des Schlüsselfeldes auf Integer, Strings und Symbole beschränkt. In Map kann das Schlüsselfeld jeden Datentyp haben (Integer, Array, Objekt).

    var map = new Map();//Leer map.set(1,'1'); map.set('one', 1); map.set('{}', {name:'Hallo, Welt!'}); map.set(12.3, 12.3) map.set(12,[12345])

    for(let [key,value] of map.entries()) console.log(key+'---'+value)

  • In der Map wird die ursprüngliche Reihenfolge der Elemente beibehalten. Dies trifft nicht auf Objekte zu.

    let obj ={ 1:'1', 'one':1, '{}': {name:'Hallo Welt'}, 12.3:12.3, } console.log(obj)

7voto

nonopolarity Punkte 138211

Dies ist eine kurze Methode für mich, um es zu merken: KOI

  1. Schlüssel. Objektschlüssel sind Zeichenfolgen oder Symbole. Karten schlüssel können auch Zahlen sein (1 und "1" sind unterschiedlich), Objekte, NaN, usw. Es verwendet ===, um zwischen Schlüsseln zu unterscheiden, mit einer Ausnahme NaN !== NaN, aber Sie können NaN als Schlüssel verwenden.
  2. Reihenfolge. Die Einfügereihenfolge wird gemerkt. Also [...map] oder [...map.keys()] hat eine bestimmte Reihenfolge.
  3. Interface. Object: obj[key] oder obj.a (in einigen Sprachen sind [] und []= wirklich Teil des Interface). Map hat get(), set(), has(), delete() usw. Beachten Sie, dass Sie map[123] verwenden können, aber das verwendet es als einfaches JavaScript-Objekt.

5voto

Oriol Punkte 246798

Zusätzlich zur Möglichkeit, in einer klar definierten Reihenfolge iterierbar zu sein und die Fähigkeit zu haben, beliebige Werte als Schlüssel zu verwenden (außer -0), können Maps aufgrund der folgenden Gründe nützlich sein:

  • Die Spezifikation erzwingt, dass Map-Operationen im Durchschnitt sublinear sind.

    Jede nicht dumme Implementierung von Objekten wird eine Hashtabelle oder Ähnliches verwenden, daher werden Eigenschaftsaufrufe wahrscheinlich durchschnittlich konstant sein. Dann könnten Objekte sogar schneller als Maps sein. Aber das wird von der Spezifikation nicht verlangt.

  • Objekte können unerwartetes Verhalten aufweisen.

    Zum Beispiel, nehmen wir an, Sie haben keine foo-Eigenschaft zu einem neu erstellten Objekt obj hinzugefügt, also erwarten Sie, dass obj.foo undefined zurückgibt. Aber foo könnte eine eingebaute Eigenschaft sein, die von Object.prototype geerbt wurde. Oder Sie versuchen, obj.foo durch eine Zuweisung zu erstellen, aber ein Setter in Object.prototype wird ausgeführt anstatt Ihren Wert zu speichern.

    Maps verhindern solche Dinge. Nun ja, es sei denn, ein Skript ändert Map.prototype. Und Object.create(null) würde auch funktionieren, aber dann verlieren Sie die einfache Objekt-Initialisierersyntax.

5voto

Sajeetharan Punkte 202348

Ich bin auf diesen Beitrag von Minko Gechev gestoßen, der die wesentlichen Unterschiede klar erklärt.

Geben Sie hier die Bildbeschreibung ein

3voto

C2Dev Punkte 71

Ein Aspekt der Karte, der hier nicht viel Beachtung findet, ist die Suche. Gemäß der Spezifikation:

Ein Map-Objekt muss entweder mit Hash-Tabellen oder anderen Mechanismen implementiert werden, die im Durchschnitt Zugriffszeiten bereitstellen, die sublinear sind in Bezug auf die Anzahl der Elemente in der Sammlung. Die in dieser Spezifikation für Map-Objekte verwendeten Datenstrukturen sollen nur die erforderlichen beobachtbaren Semantiken von Map-Objekten beschreiben. Es ist nicht als lebensfähiges Implementierungsmodell gedacht.

Für Sammlungen mit einer großen Anzahl von Elementen und Bedarf an Element-Suchen ist dies ein enormer Leistungsschub.

TL;DR - Die Objektsuche ist nicht spezifiziert, daher kann sie in der Größenordnung der Anzahl der Elemente im Objekt sein, d.h. O(n). Map-Suche muss eine Hash-Tabelle oder Ähnliches verwenden, daher ist die Map-Suche unabhängig von der Map-Größe gleich, d.h. O(1).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X