2017-03-10 3 views
0

Ich würde diese Karte Funktionalität wie erklärt:es6 Karten Einstellung ohne map.set() aufgerufen wird

let m = new Map().set('items', ["a", "b", "c"]); 

console.log(m.get('items')); // ["a", "b", "c"] 

let n = m.get('items'); 

console.log(n); // ["a", "b", "c"] 

n.push("d"); 

console.log(n); // ["a", "b", "c", "d"] 

console.log(m.get('items')); // ["a", "b", "c", "d"] 

Wie der Wert hat ‚d‘ hinzugefügt bekommen m Karte ohne Aufruf Map.set()?

Antwort

2

Es gibt nur ein Array, es wird nicht geklont, wenn m.get('items') ausgeführt wird, sondern ein Verweis auf das Array bereitgestellt wird.

Sie können dies bestätigen, indem Sie so etwas wie dies zu tun:

n === m.get('items') // returns true

, im Gegensatz zwei Arrays auch nicht gleich sind, wenn sie nichts enthalten. Zum Beispiel:

[] === [] // returns false

Ziemlich cool, ich war dieses Verhalten nicht bewusst, aber es macht Sinn. Nett!

+0

Danke, das war meine Ahnung; dass es durch Referenz, beim Versuch, Änderungen von einem Array aus einer Karte abgerufen zu bekommen, gefangen und später mit der "Original" (die ich jetzt zu der einzigen) gemappten Version zu vergleichen. Hoffnung, die Sinn macht – mhakes

+0

@EranSch Ja, in JS Werte von Rferenzierungstyp (e.q Objekt oder Arrays) werden nur dann als gleich angesehen, wenn sie einen Verweis auf den gleichen Speicherort im Speicher (also beide auf die gleiche Instanz zeigen). Und '[] === []' erstellt zwei separate Array-Instanzen –

1

Da n Variable speichert auf Array verweisen, die in der m Karte gespeichert ist (nicht kopieren) - so n Variable speichert regelmäßige Anordnung, die natürlich push Methode und m Karte speichert refernce auf das gleiche Array hat, damit es aktualisiert sieht Array. Also sowohl n Variable und Karte items Eintrag teilen Bezug auf das gleiche Array. Beachten Sie, dass dies ein typisches Verhalten für alle JS-Referenztypen ist. Wenn m gespeicherten Wert des primitiven Typs (z. B. Zeichenfolge) zuordnen, müssen Sie set verwenden, um es in Ihrer Karte zu aktualisieren.

+0

Einverstanden, nicht von der Push-Methode sprechen, sondern die map.get(), die danach kommt. Wie wurde der "d" -Wert in das Map-Schlüssel/Wert-Paar "Items" aufgenommen, ohne ausdrücklich m.set ('items', ["a", "b" "c", "d"]) zu sagen? – mhakes

+0

@mhakes Da ein Array ein Objekt ist und die in dieser Map gespeicherte Sache eine Referenz auf dieses Objekt ist. Dies ist nicht relevant für Karten im Besonderen, sondern für die allgemeine Funktionsweise von JS. – estus

+0

@EranSch und @estus sagen beide dasselbe. Du hast recht, es ist ein grundlegendes JS-Verhalten. Ich dachte zu "Klasse wie", dass eine Karte sich wie eine Klasse verhält und nicht feuern würde, wenn sie nicht aufgerufen wird. Aufgerufen ist nicht der richtige Begriff für eine Referenz, es ist angeboren. – mhakes

Verwandte Themen