Dodwin: 1. Array richtet sich nach dem 2. Array

Hallo,

Erst mal das Script zu meinem Problem:

var ar1 = new Array(1,2,3,4);  
var ar2 = ar1;  
  
while (ar2.length) {  
  ar2.shift();  
  alert(ar1.length+"-"+ar2.length);  
}

Die Schleife wird nun 4x durchlaufen. Es soll sich eigentlich nur das 2. Array ändern. Allerdings ändert sich ar1 ebenso wie ar2.

D.h. es wird bei den Durchläufen das ausgegeben:
3-3
2-2
1-1
0-0

Müsste es nicht eigentlich das ausgeben:
4-3
4-2
4-1
4-0

Warum ändert die Funktion shift denn auch das erste Array?
Ich will ar2 doch nur die Werte von ar1 zuweisen.

Vielen Dank für Hilfe,
Dodwin

--
Dodwin
  1. Hallo,

    Erst mal das Script zu meinem Problem:

    var ar1 = new Array(1,2,3,4);

    var ar2 = ar1;

    while (ar2.length) {
      ar2.shift();
      alert(ar1.length+"-"+ar2.length);
    }

    
    >   
    > Die Schleife wird nun 4x durchlaufen. Es soll sich eigentlich nur das 2. Array ändern. Allerdings ändert sich ar1 ebenso wie ar2.  
      
    
    >   
    > Warum ändert die Funktion shift denn auch das erste Array?  
    > Ich will ar2 doch nur die Werte von ar1 zuweisen.  
    >   
    > Vielen Dank für Hilfe,  
    > Dodwin  
      
    Soweit ich weiß ist das bei JS anders als bei anderen Programmiersprachen (ich weiß: Scriptsprache...scheiß drauf). Auf gut Deutsch: JavaScript übergibt bei einer Zuweisung immer Referenzen (oder wenn du aus der C-Welt kommst: Pointer), es macht keine Kopie der Variable (was du ja eigentlich wolltest). Soviel mal zum WARUM. Das WIE LÖSE ICH DAS kann ich leider auch grad nix sagen, hab ich noch nie gebraucht...  
      
    Aber vielleicht gibt dir das schon mal die richtige Denkrichtung...  
      
    Viel Erfolg,  
    Michael
    
    1. Soweit ich weiß ist das bei JS anders als bei anderen Programmiersprachen (ich weiß: Scriptsprache...scheiß drauf).

      Skriptsprachen sind auch Programmiersprachen. Warum du hier JS eine Sonderrolle zugestehst, verstehe ich allerdings nicht. Auch in einigen anderen Sprachen ist es durchaus üblich, Arrays nicht "einfach so" zu kopieren.

      Auf gut Deutsch: JavaScript übergibt bei einer Zuweisung immer Referenzen (oder wenn du aus der C-Welt kommst: Pointer), es macht keine Kopie der Variable (was du ja eigentlich wolltest). Soviel mal zum WARUM. Das WIE LÖSE ICH DAS kann ich leider auch grad nix sagen, hab ich noch nie gebraucht...

      Das "Wie löse ich das" ist ganz einfach - es muss nur eine echte Kopie erstellt werden.

      --
      Reden ist Silber, Schweigen ist Gold, meine Ausführungen sind Platin.
      Self-Code: sh:( ch:? rl:( br:> n4:( ie:{ mo:) va:) de:> zu:} fl:| ss:| ls:~ js:|
      1. Soweit ich weiß ist das bei JS anders als bei anderen Programmiersprachen (ich weiß: Scriptsprache...scheiß drauf).
        Skriptsprachen sind auch Programmiersprachen. Warum du hier JS eine Sonderrolle zugestehst, verstehe ich allerdings nicht. Auch in einigen anderen Sprachen ist es durchaus üblich, Arrays nicht "einfach so" zu kopieren.

        Ich kenn eben einige Leute, die bei der Bezeichnung "Programmeirsprache" sofort einen Compiler oder wie bei den .NET Zeugs einen JIT-Compiler vorraussetzen und mich jedesmal auf Scriptsprache korrigieren, wenn ich einfach nur von Sprachen, mit denen man programmieren kann (in meinem Sprachgebrauch: Programmiersprachen) rede. Um diesen Kommentaren vorzubeugen hab ich eben hier "Scriptsprache" geschrieben, aber dann kommen Leute wie du die auch dagegen was haben. Wie man's macht isses falsch....

        Auf gut Deutsch: JavaScript übergibt bei einer Zuweisung immer Referenzen (oder wenn du aus der C-Welt kommst: Pointer), es macht keine Kopie der Variable (was du ja eigentlich wolltest). Soviel mal zum WARUM. Das WIE LÖSE ICH DAS kann ich leider auch grad nix sagen, hab ich noch nie gebraucht...
        Das "Wie löse ich das" ist ganz einfach - es muss nur eine echte Kopie erstellt werden.

        Haha, das war ja lustig. Ich denke soweit kann jeder Neugeborene denken. Die Frage ist (für dich konkret formuliert) "wie erstelle ich mit JS eine Variablenkopie statt einer Variablenreferenz"?

        Zufrieden?

        1. Ich kenn eben einige Leute, die bei der Bezeichnung "Programmeirsprache" sofort einen Compiler oder wie bei den .NET Zeugs einen JIT-Compiler vorraussetzen und mich jedesmal auf Scriptsprache korrigieren, wenn ich einfach nur von Sprachen, mit denen man programmieren kann (in meinem Sprachgebrauch: Programmiersprachen) rede. Um diesen Kommentaren vorzubeugen hab ich eben hier "Scriptsprache" geschrieben, aber dann kommen Leute wie du die auch dagegen was haben. Wie man's macht isses falsch....

          Nein, du liegst schon richtig. Skriptsprachen sind auch Programmiersprachen (aber nicht jede Programmiersprache ist eine Skriptsprache).

          Haha, das war ja lustig. Ich denke soweit kann jeder Neugeborene denken. Die Frage ist (für dich konkret formuliert) "wie erstelle ich mit JS eine Variablenkopie statt einer Variablenreferenz"?

          Naja, sowas Triviales sollte man schon selbst können, braucht man ja sicher öfter mal (oder nicht?).

          --
          Reden ist Silber, Schweigen ist Gold, meine Ausführungen sind Platin.
          Self-Code: sh:( ch:? rl:( br:> n4:( ie:{ mo:) va:) de:> zu:} fl:| ss:| ls:~ js:|
  2. echo $begrüßung;

    [code lang=javascript]var ar1 = new Array(1,2,3,4);

    Eine Referen auf das neu erstellte Array wird in ar1 abgelegt.

    var ar2 = ar1;

    Diese Referenz wird nun auch in ar2 abgelegt.

    Warum ändert die Funktion shift denn auch das erste Array?

    Weil beide Variablen auf das gleiche Objekt verweisen.

    Ich will ar2 doch nur die Werte von ar1 zuweisen.

    Dann brauchst du eine Kopie. Das müsste sich mit ar2 = ar1.slice(0) erledigen lassen.

    echo "$verabschiedung $name";

    1. Hallo dedlfix,

      Warum ändert die Funktion shift denn auch das erste Array?
      Weil beide Variablen auf das gleiche Objekt verweisen.

      Verstehe. Das war das Problem.

      Dann brauchst du eine Kopie. Das müsste sich mit ar2 = ar1.slice(0) erledigen lassen.

      Ja, so geht's.

      Wieder was dazu gelernt ;)

      Danke (auch den anderen Antwortenden),
      Dodwin

      --
      Dodwin
  3. Tach,

    Warum ändert die Funktion shift denn auch das erste Array?

    du hast kein zweites Array erzeugt sondern nur eine neue Referenz auf das erste Array.

    Ich will ar2 doch nur die Werte von ar1 zuweisen.

    Dann mach das doch: Erst ein neues Array erstellen, dann in einer Schleife die Werte zuweisen.

    mfg
    Woodfighter