JavaScript Newbie: Referenz auf String

Hallo!
Habe eine Frage:
Ich habe einen String, und will diesen einer Funktion übergeben. Diese soll den String aber ändern können. Also nicht call by value, sondern call by reference. Quasi der Pointer in C.

In diesem Beispiel hier wird zweimal "test1" ausgegeben. Wie kann ich der Funktion eine Referenz übergeben?

function test1()
{
 var stest = new String;
 stest = "Test1";
 window.alert(stest);
 test2(stest);
 window.alert(stest);
}

function test2(Bla)
{
 Bla = "Juhu";
}

Ich hatte gehofft, das duch "stest = new String" ein Object erstellt wird.

Vielen Dank im Vorraus!

  1. hi,

    In diesem Beispiel hier wird zweimal "test1" ausgegeben. Wie kann ich der Funktion eine Referenz übergeben?

    Javascript kennt m.W. keine Möglichkeit, dies explizit zu beeinflussen.

    Objekte werden immer by reference übergeben, skalare Werte immer by value.

    function test1()
    {
    var stest = new String;
    stest = "Test1";
    window.alert(stest);
    test2(stest);
    window.alert(stest);
    }

    function test2(Bla)
    {
    Bla = "Juhu";
    }

    Ich hatte gehofft, das duch "stest = new String" ein Object erstellt wird.

    Nun, Klammern solltest du eigentlich schon anhängen, wenn du ein Objekt erzeugen willst:

    var stest = new String();

    Allerdings überschreibst du dir diese Objektreferenz gleich in der nächsten Zeile wieder:
    stest = "Test1";
    Damit ist stest jetzt wieder ein skalarer Wert. Ja, Javascript ist an dieser Stelle ein bisschen schizophren - normale Textliterale sind _keine_ Objekte vom Typ String - obwohl sie dessen Methoden unterstützen ...

    Wenn du wirklich ein String-Objekt anlegen willst, welches "Test1" beinhaltet, dann könntest du schreiben:

    var stest = new String("Test1");

    Aber auch dann wird das mit der Übergabe per reference so m.E. nicht funktionieren. Selbst wenn es funktionieren würde - dann würde mit der Zeile
    Bla = "Juhu";
    wieder das gleiche geschehen, wie gerade schon erwähnt - die Objektreferenz wird wieder durch ein Textliteral, welches _kein_ Objekt ist, überschrieben.

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Aha! Da kommt schonmal ein wenig Licht ins Dunkel!

      Und wie könnte ich dann den Inhalt der Variablen ändern, ohne dass ich die Objektreferenz wieder durch ein Textliteral überschreibe?

      1. hi,

        Und wie könnte ich dann den Inhalt der Variablen ändern, ohne dass ich die Objektreferenz wieder durch ein Textliteral überschreibe?

        Entweder durch die Verwendung globaler Variablen, oder in dem du dir ein eigenes Objekt erzeugst - wird ja dann automatisch per Referenz übergeben, diesem dann Eigenschaften anhängst, und nur deren Werte veränderst.

        Also in etwa so:

          
        function test1() {  
         var stest = new Object();  
         stest.stringwert = "Test1";  
         window.alert(stest.stringwert);  
         test2(stest);  
         window.alert(stest.stringwert);  
        }  
          
        function test2(Bla) {  
         Bla.stringwert = "Juhu";  
        }
        

        Das ist die etwas "feinere" Methode, als mit globalen Variablen - die man ja, wo möglich, vermeiden sollte.

        Vom _Prinzip_ her ist aber beides auch wieder das gleiche:
        Globale Variablen sind auf nur Objekteigenschaften - die des window-Objektes. Nur muss man da nicht jedes Mal window übergeben (das ist ja seinerseits schon überall global verfügbar) - und man muss auch nicht window.variablenname = "xyz" schreiben, sondern variablenname = "xyz" genügt - dass es im lokalen Scope keine Variable dieses Namens gibt, merkt der Interpreter selber, und hangelt sich dann "weiter nach oben", bis er bei window ankommt, und dort dann letztendlich eine Variable bzw. Eigenschaft mit diesem Namen vorfindet.

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
        1. Entweder durch die Verwendung globaler Variablen, oder in dem du dir ein eigenes Objekt erzeugst - wird ja dann automatisch per Referenz übergeben, diesem dann Eigenschaften anhängst, und nur deren Werte veränderst.

          Also JavaScript hat schon so ein paar Eigenschaften, die gefallen mir irgenwie immer weniger. Da geht doch nix über einen schönen Zeiger!! ;-)

          Vielen Dank für die Hilfe, muss es wohl mit nem eigenen Objekt lösen.

      2. gruss newbie,

        wahsage schrieb:

        Objekte werden immer by reference übergeben, skalare Werte immer
        by value.

        newbie fragte nach:

        Und wie könnte ich dann den Inhalt der Variablen ändern, ohne dass ich
        die Objektreferenz wieder durch ein Textliteral überschreibe?

        ... indem Du das [String]-objekt ausdruecklich UND *korrekt* erzeugst.

        in den vier alert-meldungen steckt alles drin was Du dazu wissen musst:

        http://forum.de.selfhtml.org/archiv/2007/5/t152710/#m993450

        so long - 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. Hello out there!

      Nun, Klammern solltest du eigentlich schon anhängen, wenn du ein Objekt erzeugen willst:
      var stest = new String();

      Wie [molily] sagte: „Siehe http://forum.de.selfhtml.org/archiv/2005/1/t99078/#m604906 ff.“

      See ya up the road,
      Gunnar

      --
      „Wer Gründe anhört, kommt in Gefahr nachzugeben.“ (Goethe)