2016-06-11 4 views
2

Ich lerne gerade die neuen Sprachfunktionen, die mit ES6 in JavaScript kommen.In welchen Fällen sollte ich ES6-Maps anstelle von JavaScript-Objekten bevorzugen?

JavaScript-Objekte sind immer was ich aus anderen Sprachen als Hash-Maps oder assoziative Arrays kenne.

Jetzt hat die Sprache Karten. Aber ich frage mich: Gibt es wirklich Fälle, in denen es nicht möglich wäre, dasselbe durch die Verwendung eines Objekts als Datenstruktur zu erreichen?

Okay ..., Karten haben ein paar bequeme Methoden extra. Trotzdem: Ich konnte keinen Anwendungsfall herausfinden, in dem das Gleiche nicht mit einem Objekt möglich wäre.

Weiß jemand, warum Karten in die Sprache integriert wurden? Oder besser: Kann mir jemand einen Anwendungsfall zeigen, in dem ich besser eine Karte anstelle eines Objekts verwenden könnte?

+0

Sicher - wenn Schlüssel keine Zeichenfolgen sind. – zerkms

Antwort

2

Objekte sind in Ordnung, wenn Sie Verwenden Sie nur Zeichenfolgen als Schlüssel. Mit Maps können Sie jedoch auch andere Datentypen als Schlüssel verwenden. Wenn Sie über ihre Schlüssel und Werte iterieren, haben sie eine vorhersehbare Reihenfolge (die Reihenfolge, in der Sie die Elemente eingefügt haben).

Have a look at the MDN here for more information.

+0

Kurz und gut. Danke vielmals. – mewi

1

Wie oft geht es um eine sauberere Datenstruktur und um Dinge einfacher zu machen.

Hier ist ein Vergleich, was Sie mit der Karte tun können vs, was Sie mit einem normalen Objekt tun kann

ECMAScript 6

let s = new Set() 
s.add("hello").add("goodbye") 

let m = new Map() 
m.set("hello", 42) 
m.set(s, 34) 
m.get(s) === 34 
m.size === 2 
for (let [ key, val ] of m.entries()) 
    console.log(key + " = " + val) 

ECMAScript 5

var s = {}; 
s["hello"] = true; s["goodbye"] = true; 

var m = {}; 
m["hello"] = 42; 
// no equivalent in ES5 
// no equivalent in ES5 
Object.keys(m).length === 2; 
for (key in m) { 
    if (m.hasOwnProperty(key)) { 
     var val = m[key]; 
     console.log(key + " = " + val); 
    } 
} 
+1

Können Sie 's' in Ihrem Code definieren? – trincot

+0

@Der Tieran: Im Beispiel ECMAScript 6 ist s eine Variable? Irgendwo oben erklärt? Das Code-Snippet allein würde nicht funktionieren. – mewi

+0

Auch das Durchschleifen eines Objekts kann in ES5 eleganter durchgeführt werden: 'Object.keys (m) .forEach (...);' – nils

0

Wenn Sie ein Objekt als eine Karte verwenden, dann können die Tasten mit den Objekten integrierten Eigenschaften von in Konflikt geraten. Dies kann ein Problem sein, wenn die Schlüssel vom Benutzer oder einer externen Quelle gelesen werden.

var a = {}; 

// Put value in map 
a['hasOwnProperty'] = 1; 

for(x in a) { 
    // TypeError: a.hasOwnProperty is not a function 
    if(a.hasOwnProperty(x)) { 
     console.log(x); 
    } 
} 
Verwandte Themen