Mein Problem bezieht sich auf den letzten Abschnitt. Der Bereich, in dem
der String '########' geschrieben wird. Bis vor diesem Punkt, werden
meine Daten wie erwartet in das Object "alerts" angehängt. Das passt.
Aber im letzten Block werden nicht einfach neue Daten angehängt, sondern
zusätzlich auch die bestehenden Daten überschrieben.
Kann mir jemand sagen warum das passiert? Ich dachte es wird mit push()
immer nur angehängt.
log-output:
ich schrieb:> Aber im letzten Block werden nicht einfach neue Daten angehängt, sondern> zusätzlich auch die bestehenden Daten überschrieben.> Kann mir jemand sagen warum das passiert?
Ja.
Die Datentypen Boolean, Null, Undefined, Number und String, sind in
Javascript unveränderliche Datentypen.
Der Datentyp Objekt (und Array) hingegen ist ein veränderlicher
Datentyp.
Wenn Du einer Variablen in Javascript ein Objekt "zuweist", wird ein
Zeiger auf das Objekt in die Variable gespeichert, und nicht das
Objekt selbst.
Wenn Du nun diese Variable (mit einem Zeiger auf ein ein Objekt) in eine
andere kopierst, wird der Zeiger kopiert, aber nicht das Objekt.
D.h. wenn Du folgendes schreibst:
1
let a, b;
2
3
a = { msg: "Hallo, Welt!" };
4
b = a;
Hast Du anschließend zwei Variablen, aber nur ein Objekt. Beide
Variablen, a und b, zeigen auf das selbe, eine Objekt.
Wenn Du nun das Objekt änderst, egal über welchem "Zeiger" (a oder b),
veränderst Du eben dieses eine Objekt.
Hier hast Du nun zwei Variablen und zwei Objekte. Jede Variable zeigt
auf ein anderes Objekt. Zufälligerweise haben beide Objekte aber den
gleichen Inhalt.
Ein kleines Testprogramm verdeutlicht das:
Danke schön für die ausführliche Erklärung. Konnte es nun auch
verstehen.
Gibt es denn irgend eine andere Möglichkeit ein Objekt durch kopieren
komplett neu zu erstellen?
In meinem Skript wollte ich eigentlich ein Objekt als template
erstellen. Dieses Template sollte dann im laufenden Betrieb
unterschiedlich oft vervielfältigt werden.
ich schrieb:> Gibt es denn irgend eine andere Möglichkeit ein Objekt durch kopieren> komplett neu zu erstellen?
Quick&Dirty für plain objects:
const clonedObject=JSON.parse(JSON.stringify(sourceObject));
("Quick" bezieht sich auf den Implementierungs-Aufwand, nicht die
Laufzeit)
Ansonsten hört sich dein Plan eher nach einem OOP-Fall an, also
class MeineBasis {
...
}
class Irgendwas extends MeineBasis {
...
}
const instanz1=new Irgendwas;
const instanz2=new MeineBasis;
const instanz3=new Irgendwas;
usw...
ich schrieb:> Gibt es denn irgend eine andere Möglichkeit ein Objekt durch kopieren> komplett neu zu erstellen?
Nein. Man kann keine perfekte & vollständige deep copy eines beliebigen
Objektes machen. Meistens ist das aber auch nicht nötig. Die
JSON.parse(JSON.stringify(x)); Methode z.B. kann nur Zahlen, Nummern,
Arrays, und Typenlose objekte, ohne Rekursion. Oft genügt sowas aber.
Manchmal genügt sogar eine shallow copy, schau dir mal Object.assign und
den spread operator an. Und dann gibt es noch Object.create, statt einer
Kopie erzeugt das eine art overlay, indem es die Prototypchain ausnutzt.
Für deine Zwecke wird aber wohl eine klasse besser geeignet sein, oder
sogar einfach eine Funktion, die das Objekt erstellt:
ich schrieb:> Gibt es denn irgend eine andere Möglichkeit ein Objekt durch kopieren> komplett neu zu erstellen?
Für Deinen Fall funktioniert der Spread-Operator sehr gut: