Jojo55: Array kopieren => Referenz

Hallo,
Ich habe ein Problem mit JavaScript:

Ich habe ein sehr umfangreiches Array test.

Nun möchte ich an diesem Array ein paar Änderungen vornehmen und das ganze als test2 abspeichern.

  
test = new Array();  
test[0] = 10;  
  
test2 = test;  
test2[0] += 4;  
  
alert(test[0]);  

Nach diesem Beispiel wird aber 14 ausgegeben: Obwohl ich nur test2 ändern wollte, wurde test auch geändert, weil beim kopieren des Arrays eine Referenz erstellt wurde.
Was kann ich dagegen machen?

Vielen Dank,
Jojo55

  1. Nach diesem Beispiel wird aber 14 ausgegeben: Obwohl ich nur test2 ändern wollte, wurde test auch geändert, weil beim kopieren des Arrays eine Referenz erstellt wurde.
    Was kann ich dagegen machen?

    Element für Element kopieren.

    1. Element für Element kopieren.

      Also das würde ja ne halbe Ewigkeit dauern !

      Es ist doch total planlos aus alles und jedem ne Referenz zu machen !!!
      ---> Wenn ich so nen schnick schnack will, dann sollte man sowas mit einem speziellem Operator machen oder so.
      ---> Sollten sich mal ein Beispiel an PHP nehmen (&-Operator) bzw. dann clone

      1. hallo again Jojo55,

        Es ist doch total planlos aus alles und jedem ne Referenz zu machen !!!

        nun, das ist in JavaScript ja auch ueberhaupt nicht der fall.

        die kurzfassung sieht so aus:
           - werte werden beim zuweisen von einer adresse auf eine andere kopiert,
             objekte hingegen referenziert.
           - in javascript ist fast alles "object" bis auf "string/number/boolean values".
           - die drei letztgenannten sind auch nur dann "value", wenn sie als literale -
             "bla", 48, true - oder als funktionswerte - String("bla"), Number(48),
             Boolean(true) - initialisiert bzw. im typ gewandelt wurden. sobald der
             operator "new" vor einem der drei konstruktoren steht, wird ein objekt
             erzeugt.

        objekte bei zuweisungen zu referenzieren statt zu kopieren/klonen ist
           klug gedacht und mitnichten "planlos" ..

        ---> Wenn ich so nen schnick schnack will, dann sollte man sowas mit
        einem speziellem Operator machen oder so.
        ---> Sollten sich mal ein Beispiel an PHP nehmen (&-Operator) bzw.
        dann clone

        .., denn umgekehrt wird ein schuh daraus. die praxis kommt in den aller-
           meisten faellen mit referenzen aus. wer die moeglichkeiten dieser sprache
           jedoch ausreizen kann und will, schreibt sich fuer die spezialfaelle eigene
           objekt-prototypen. so bleibt der client weitestgehend schlank und schnell.

        by(t)e by(t)e - peterS. - pseliger@gmx.net

        --
        "Because objects in JavaScript are so flexible, you will want to think differently about class hierarchies.
        Deep hierarchies are inappropriate. Shallow hierarchies are efficient and expressive." - Douglas Crockford
        ie:( fl:) br:> va:( ls:& fo:) rl:| n3;} n4:} ss:} de:µ js:} mo:? zu:]
    2. gruss s schumann, hallo Jojo55,

      Was kann ich dagegen machen?

      Element für Element kopieren.

      und wenn diese elemente ebenfalls wieder (komplexe)
         objekte und eben nicht (einfache) werte sind?

      das klonen von javascript-objekten ist nicht trivial.

      in diesem fall koennte eine "copy"-methode angewandt
         auf gegebenes bsp. aber dann doch so aussehen:

      ~~~javascript Array.prototype.copy = function () {
           return ((new Array()).concat(this));
         };

      var arr = new Array();
         arr[0] = new Number(10);

      var arr02 = arr.copy();
         arr02[0] += 4;

      alert(arr[0]);   // 10;
         alert(arr02[0]); // 14;

        
        
        
         by(t)e by(t)e - peterS. - pseliger@gmx.net  
        
        
      
      -- 
      "Because objects in JavaScript are so flexible, you will want to think differently about class hierarchies.  
      Deep hierarchies are inappropriate. Shallow hierarchies are efficient and expressive." - Douglas Crockford  
        
      ie:( fl:) br:> va:( ls:& fo:) rl:| n3;} n4:} ss:} de:µ js:} mo:? zu:]
      
      1. in diesem fall koennte eine "copy"-methode angewandt
           auf gegebenes bsp. aber dann doch so aussehen:
           [...]

        Ahhh

        Das hört sich doch schon mal um einiges besser an !
        ---> Ich werde das ganze mal morgen ausprobieren und dann das Ergebnis hier rein posten ;)

        Bis dann

        Und nochmal danke für diesen tipp

      2.   
        
        >    Array.prototype.copy = function () {  
        >      return ((new Array()).concat(this));  
        >    };  
        
        

        Was trotzdem nur Referenzen kopiert, wenn die Elemente des Array auch Objektreferenzen sind. Oder sehe ich das falsch?

        1. Tag.

          Array.prototype.copy = function () {
               return ((new Array()).concat(this));
             };

          
          > Was trotzdem nur Referenzen kopiert, wenn die Elemente des Array auch Objektreferenzen sind. Oder sehe ich das falsch?  
            
          Nein, das ist richtig, wie Peter schon in <https://forum.selfhtml.org/?t=115519&m=738095> sinngemäß schrieb. Kurz zusammengefasst: Arrayelemente vom Typ String, Number und Boolean werden kopiert, alle anderen referenziert. Siehe auch [Array.concat()](http://de.selfhtml.org/javascript/objekte/array.htm#concat) ("Beachten Sie:"). Funktionen könntest du mit dem [Function-Objekt](http://de.selfhtml.org/javascript/objekte/function.htm) kopieren, aber für sinnvoll halte ich das nicht, genausowenig wie das Kopieren von Objekten.  
            
          Siechfred
          
          -- 
          [Codeschnipsel gefällig?](http://sniplets.anaboe.net) || [Neues aus der Steuerwerkstatt](http://www.steuerwerkstatt.de/news.php)
          
        2. gruss  s schumann,

          Was trotzdem nur Referenzen kopiert, wenn die Elemente des Array auch
          Objektreferenzen sind. Oder sehe ich das falsch?

          nein, Deine annahme ist goldrichtig.

          mich auf Deine aussage beziehend -

          Element für Element kopieren. -

          schrieb ich deshalb ja auch ...

          und wenn diese elemente ebenfalls wieder (komplexe)
          objekte und eben nicht (einfache) werte sind?

          ... und fuegte, auf das gegebene bsp.
             eingehend, hinzu ...

          in diesem fall koennte eine "copy"-methode angewandt
          auf gegebenes bsp. aber dann doch so aussehen:

          ... weil dies einem zumindest das elementweise uebertragen
             von einem array in das andere erspart.

          vielleicht war das auch alles etwas missverstaendlich
             formuliert, aber in anbetracht der vorgerueckten stunde
             zumindest nicht falsch.

          by(t)e by(t)e - peterS. - pseliger@gmx.net

          --
          "Because objects in JavaScript are so flexible, you will want to think differently about class hierarchies.
          Deep hierarchies are inappropriate. Shallow hierarchies are efficient and expressive." - Douglas Crockford
          ie:( fl:) br:> va:( ls:& fo:) rl:| n3;} n4:} ss:} de:µ js:} mo:? zu:]
          1. vielleicht war das auch alles etwas missverstaendlich
               formuliert, aber in anbetracht der vorgerueckten stunde
               zumindest nicht falsch.

            Nein, nur bin ich durch die Einleitung von einer Lösung des von Dir angesprochenen Problems ausgegangen, die in dem Beispiel meiner Meinung nach aber ausblieb. Dann stimmt meine Welt jetzt wieder *g*

  2. Wenn ich das richtig sehe, dann hängst du an dem Problem jeder 'höheren' Programmiersprache - nämlich wie tief muß man kopieren.

    Mal leicht philosophisch abgegleitet - in die Sprache 'Smalltalk':
    Bei einem 'deepcopy' wird eine echte Kopie angelegt, bei einem 'shallowcopy' nur eine Referenz.
    Wir hatten auf der Uni immer das Problem, daß wir was zwischen den beiden brauchten, und dabei sind eine Unmenge an angepassten Copys entstanden. Eine bessere Lösung haben wir nicht gefunden.

    Fazit: Wenn du also eine Lösung für dein Problem suchst - es gibt wohl keinen anderen Weg als denn steinigen welchen...