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
)