• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

rechnen mit objekten von variablen/arrays

hallo

ich bin im Moment ratlos warum folgender teil eines Scriptes nicht geht:
Code:
var closedList = new Array(); 
    closedList.push({
                     [COLOR=#ff0000]x: 10, [/COLOR]
                     y: 10, 
                     });

var tempPunkt;

        console.log("tempPunkt vor definerung:",tempPunkt);
        console.log("closedList:", closedList[0]);


[COLOR=#ff0000]tempPunkt = closedList[0];[/COLOR]


    console.log("tempPunkt nach definierung:",tempPunkt);       
    
[COLOR=#ff0000]tempPunkt.x = tempPunkt.x + 40;[/COLOR]


    console.log("tempPunkt nachdem objekt x um 40 erhöht:",tempPunkt);
    console.log("closedList:", closedList[0]);
alles was passieren soll ist, dass tempPunkt.x um 10 erhöht werden soll! das was passiert ist mir aber völlig unbegreiflich... tempPunkt.x nimmt den Wert 40 an(sollte 50) aber das wiklich komische ist, dass sich closedList verändert ohne dass ich irgendetwas mache(rot)!
konsole:
tempPunkt vor definerung: undefined
closedList:
Object

  • x: 40
  • y: 10
  • __proto__: Object
tempPunkt nach definierung:
Object

  • x: 40
  • y: 10
  • __proto__: Object
tempPunkt nachdem objekt x um 40 erhöht:
Object

  • x: 40
  • y: 10
  • __proto__: Object
closedList:
Object

  • x: 40
  • y: 10
  • __proto__: Object
 
Zuletzt bearbeitet:
Werbung:
Werbung:
ja funtionieren tuts aber schau mal was mit den werten von closedList passiert! die ändern sich! oder tun die das bei dir nicht?! das ist das komische; die ändern sich wenn ich temPunkt die Objekte von closedList[0] zuordne.
ich markier nochmal nen bissl was im code dann wirds vllt deutlicher
 
Ah, da war ich wohl ein bisschen unaufmerksam. Das liegt daran, dass bei der Zuweisung tempPunkt eine Referenz auf das Array bekommt und womöglich das erste Element eine Referenz auf das Object Literal.
Du könntest eine Kopie anlegen, für ein Array geht das eig. ganz einfach:

Code:
var kopie = original.concat();

Und für Objekte dürftest du auch was im Netz finden.
 
Werbung:
„clone“ oder „deep copy“ ist das Stichwort.

Ihr könnt euch vorstellen, dass eine Variable, die ein Objekt hält, als konkreten Wert einen Object-Identifier enthält. Das ist meinetwegen eine Zahl, über die JavaScript selbsttätig das Objekt ausfinding macht, das irgendwo anders im Speicher abgelegt ist.

Bei tempPunkt = closedList[0] wird einfach dieser Object-Identifier echt kopiert (existiert dann an beiden Stellen im Speicher).

Da der Object-Identifier aber nach wie vor dasselbe Objekt im Speicher identifiziert, ändert es die Werte eben zentral dort.

Das ist völlig normal bei Objekten.

Wunderhübsche Zeichnung:

Code:
                                      Variable     Wert
                                     ------------------------

var closedList = [{x: 10, y: 5}];     closedList
                                          [0]   => #object1 ---> {x: 10, y: 5}
                                          
                                                                     ^ 
                                                                     |
var tempPunkt = closedList[0];        tempPunkt => #object1 ---------+
 
Zuletzt bearbeitet:
Zurück
Oben