Dupliziertes Objekt in Javascript

7

Ich sehe zwei Möglichkeiten, Objekte zu duplizieren

1.

%Vor%

2.

%Vor%

Die erste ist kürzer als die zweite, was ist die Effizienz im zweiten Beispiel?

    
user1801625 08.11.2012, 10:35
quelle

4 Antworten

7
___ answer13287357 ___

In der ersten Version dupliziert / klonst du das Objekt nicht, du machst einfach einen zusätzlichen Verweis darauf:

%Vor%

Um ein Objekt zu klonen, gibt es eine Reihe von Bibliotheken, die das für Sie tun können:

%Vor%

Oder Sie können es nativ machen:
Einfacher Klon:

%Vor%

Scratch einer tiefen Klonfunktion:

%Vor%     
___ qstnhdr ___ Dupliziertes Objekt in Javascript ___ qstntxt ___

Ich sehe zwei Möglichkeiten, Objekte zu duplizieren

1.

%Vor%

2.

%Vor%

Die erste ist kürzer als die zweite, was ist die Effizienz im zweiten Beispiel?

    
___ answer13287348 ___

Der erste kopiert den Verweis und dupliziert das Objekt nicht, der zweite erstellt einen neuen Verweis und kopiert dann die Elemente (die wiederum Referenzen sind) kopiert nur die Referenzen).

Vielleicht möchten Sie sich diese andere SO anschauen - Does Javascript Gleichheitszeichen Referenzobjekte oder klont sie?

Es geht nicht um Effizienz, sondern letztlich um Korrektheit. Wenn Sie einen Verweis auf ein Objekt zwischen verschiedenen Codeblöcken freigeben müssen (z. B. damit mehrere Codeteile das gleiche Objekt verwenden können), verlassen Sie sich einfach auf die Tatsache, dass JavaScript als Verweis übergeben wird.

Wenn Sie jedoch ein Objekt zwischen Methoden kopieren müssen, können Sie möglicherweise Ihr einfaches Beispiel in Ihrem zweiten Codeblock verwenden (wenn Ihre Objekte keine anderen "Objekte" enthalten), andernfalls könnten Sie das tun müssen einen Deep-Clone implementieren (siehe So klonen Sie tief in JavaScript , und achte auf die Antwort (en) dort - es ist keine triviale Angelegenheit.)

    
___ antwort13287346 ___

Die erste erstellt keine Kopie, kopiert aber nur die Referenz, also zeigen a und b nach der Operation auf dasselbe Objekt.

Im zweiten Fall wird jedes Attribut jedoch separat kopiert, so dass eine "echte" Kopie des Objekts in a entsteht (solange nur primitive Typen in den Eigenschaften vorhanden sind, ansonsten haben Sie das gleiche Problem bei) eine tiefere Ebene).

Also im ersten Fall, wenn Sie b.c ändern, ändert sich auch a.c , während es im zweiten Fall nicht funktioniert.

    
___ answer13287870 ___

Wie andere hier gesagt haben: Die erste Zuweisung weist einen neuen Verweis auf ein vorhandenes Objekt zu, die zweite führt eine flache Kopie aus.
oberflächlich meine ich : Nur das Basisobjekt wird kopiert, es gibt keine Rekursion:

%Vor%

Um dieses Problem zu lösen, würden Sie sich denken, dass eine einfache rekursive Funktion ausreichen würde:

%Vor%

Aber seien Sie müde von zirkulären Referenzen !

%Vor%

Dies erzeugt endlose Rekursion, auch bekannt als Deadlock-Szenario, es sei denn, Sie fügen eine Überprüfung nur für solche Fälle hinzu:

%Vor%

Nun, das ist ziemlich ausführlich und in den meisten Fällen völliger Overkill, wenn Sie nur zwei Objekte mit den gleichen Daten haben wollen, die aber unabhängig voneinander geändert werden können (also nicht auf dasselbe Objekt im Speicher verweisen), alles was Sie brauchen ist 1 Codezeile:

%Vor%

Untere Zeile: Das Zuweisen eines Verweises ist sicherlich effizienter: Es erfordert nicht, dass der Objektkonstruktor ein zweites Mal aufgerufen wird, noch benötigt er eine zusätzliche Kopie irgendeiner der Konstanten. Der Nachteil ist: Sie haben ein einzelnes Objekt und können versehentlich etwas ändern / löschen, von dem Sie annehmen, dass es immer noch vorhanden ist, wenn Sie die andere Referenz verwenden ( %code% )

    
___ tag123object ___ Ein Objekt ist eine Entität, die durch Befehle in einer Programmiersprache manipuliert werden kann. Ein Objekt kann ein Wert, eine Variable, eine Funktion oder eine komplexe Datenstruktur sein. In der objektorientierten Programmierung bezieht sich ein Objekt auf eine Instanz einer Klasse. ___ tag123javascript ___ JavaScript (nicht zu verwechseln mit Java) ist eine dynamische Sprache mit mehreren Paradigmen auf hoher Ebene, die sowohl für das clientseitige als auch für das serverseitige Scripting verwendet wird. Verwenden Sie dieses Tag für Fragen zu ECMAScript und seinen verschiedenen Dialekten / Implementierungen (außer ActionScript und Google-Apps-Script). ___
Sirko 08.11.2012, 10:39
quelle
12

In der ersten Version dupliziert / klonst du das Objekt nicht, du machst einfach einen zusätzlichen Verweis darauf:

%Vor%

Um ein Objekt zu klonen, gibt es eine Reihe von Bibliotheken, die das für Sie tun können:

%Vor%

Oder Sie können es nativ machen:
Einfacher Klon:

%Vor%

Scratch einer tiefen Klonfunktion:

%Vor%     
andlrc 08.11.2012 10:39
quelle
4

Wie andere hier gesagt haben: Die erste Zuweisung weist einen neuen Verweis auf ein vorhandenes Objekt zu, die zweite führt eine flache Kopie aus.
oberflächlich meine ich : Nur das Basisobjekt wird kopiert, es gibt keine Rekursion:

%Vor%

Um dieses Problem zu lösen, würden Sie sich denken, dass eine einfache rekursive Funktion ausreichen würde:

%Vor%

Aber seien Sie müde von zirkulären Referenzen !

%Vor%

Dies erzeugt endlose Rekursion, auch bekannt als Deadlock-Szenario, es sei denn, Sie fügen eine Überprüfung nur für solche Fälle hinzu:

%Vor%

Nun, das ist ziemlich ausführlich und in den meisten Fällen völliger Overkill, wenn Sie nur zwei Objekte mit den gleichen Daten haben wollen, die aber unabhängig voneinander geändert werden können (also nicht auf dasselbe Objekt im Speicher verweisen), alles was Sie brauchen ist 1 Codezeile:

%Vor%

Untere Zeile: Das Zuweisen eines Verweises ist sicherlich effizienter: Es erfordert nicht, dass der Objektkonstruktor ein zweites Mal aufgerufen wird, noch benötigt er eine zusätzliche Kopie irgendeiner der Konstanten. Der Nachteil ist: Sie haben ein einzelnes Objekt und können versehentlich etwas ändern / löschen, von dem Sie annehmen, dass es immer noch vorhanden ist, wenn Sie die andere Referenz verwenden ( delete b.some;/*some time later*/a.some.replace(/p/g,'q');//<--error )

    
Elias Van Ootegem 08.11.2012 11:10
quelle
3

Der erste kopiert den Verweis und dupliziert das Objekt nicht, der zweite erstellt einen neuen Verweis und kopiert dann die Elemente (die wiederum Referenzen sind) kopiert nur die Referenzen).

Vielleicht möchten Sie sich diese andere SO anschauen - Does Javascript Gleichheitszeichen Referenzobjekte oder klont sie?

Es geht nicht um Effizienz, sondern letztlich um Korrektheit. Wenn Sie einen Verweis auf ein Objekt zwischen verschiedenen Codeblöcken freigeben müssen (z. B. damit mehrere Codeteile das gleiche Objekt verwenden können), verlassen Sie sich einfach auf die Tatsache, dass JavaScript als Verweis übergeben wird.

Wenn Sie jedoch ein Objekt zwischen Methoden kopieren müssen, können Sie möglicherweise Ihr einfaches Beispiel in Ihrem zweiten Codeblock verwenden (wenn Ihre Objekte keine anderen "Objekte" enthalten), andernfalls könnten Sie das tun müssen einen Deep-Clone implementieren (siehe So klonen Sie tief in JavaScript , und achte auf die Antwort (en) dort - es ist keine triviale Angelegenheit.)

    
Andras Zoltan 08.11.2012 10:39
quelle

Tags und Links