2017-08-11 2 views
0

Ich stieß auf ein seltsames Problem in meiner Knoten-Anwendung. Wenn ich den Inhalt einer Variablen nehme und sie einer anderen zuweise, kettet sie irgendwie eine Verbindung zwischen ihnen auf die Art und Weise, dass, wenn ich Inhalte in der zweiten Variable ändere, auch die erste betrifft, von der ich Inhalt genommen habe.Zuweisung von Wert der Variablen zu einer anderen Variablen macht es zu einem Spiegel

dies ist mein Server-Struktur:

var body = {}; 

lässt Körper bevölkern jetzt:

body[_session] = { 
    content: { /* some data here */ }, 
    sockets: [] 
}; 

dann irgendwann ich dies tun:

body[new_session] = { 
    content: body[_session].content, 
    sockets: [] 
}; 

zu diesem Zeitpunkt vorgenommenen Änderungen zu new_session Inhalt wird auch auf Original _session Inhalt gemacht werden.

i löste dieses Problem, indem sie dies zu tun:

body[new_session] = { 
    content: JSON.parse(JSON.stringify(body[_session].content)), 
    sockets: [] 
}; 

aber es scheint, wie kostspieliger Vorgang und etwas, das ich nicht noch gerade vermieden werden könnte, wissen, wie, vielleicht jemand eine Idee, warum es passiert und wie es kann ohne viel Aufwand gelöst werden.

+1

Objektzuweisungen in Javascript sind nur Referenzbedeutung, nur Referenzen auf die Objekte werden zugewiesen, nicht die Kopie davon. – abhishekkannojia

Antwort

0

Die beste Lösung (in Bezug auf die Leistung) wäre nur auf den Befehl assign in self-executing anonyme Funktion wie folgt tun ausführen:

(function(__content) { 
    body[new_session] = { 
     content: __content, 
     sockets: [] 
    }; 
}(body[_session].content)); 

Der oben genannte Funktionstyp erstellt seinen eigenen Bereich, so dass die Verbindung getrennt wird.

Kein Klonen von Konstruktor oder Eigenschaften von Objekt ist das gleiche wie das, was Sie bereits getan haben.

+0

das half zwar und scheint flexibel zu sein, egal welche ES-Version verwendet wird, ich mag diese, thx –

1

Wenn Sie nur eine Referenz erstellen, müssen Sie die Eigenschaften von body[_session].content korrekt auf ein neues Objekt kopieren.

Wenn Sie ES6 verwenden dann versuchen Object.assign:

content: Object.assign({}, body[_session].content) 

Wie man hier sehen kann: https://jsperf.com/object-assign-vs-iife - es ist 3,5-mal schneller als die stringify/Parse-Methode, während besser lesbar zu sein. Ich habe die Lösung von Mevia hinzugefügt, um zu zeigen, dass sie schneller, aber ausführlicher und schwieriger zu einer bestehenden, gut strukturierten Codebasis hinzuzufügen ist.

geben sonst eine Lösung von hier aus einen Sprung: How do I correctly clone a JavaScript object?

+0

es ist fast das gleiche wie Autor Lösung, es einfach kopieren Paste, es ist keine gute Lösung – Mevia

+0

@Mevia - es ist die einzige Lösung, die es gibt. Es ist ähnlich dem des Autors, aber es macht es lesbarer, indem es eine Funktion benutzt, von der das OP vielleicht nichts weiß. Wenn Sie eine bessere Lösung haben, dann schreiben Sie es bitte. – Joe

+0

lese meine Antwort, es ist nicht die einzige Lösung, ich präsentierte Lösung, die keine Kopie Paste erfordert, es nur Scope-Schalter, der in Bezug auf die Leistung viel besser ist – Mevia

Verwandte Themen