JavaScript: Variablen tauschen

hi,
ich hätte gern für eine javascript-programmierung eine function „tauschen(x,y)“, die 2 variablen (zahlen) tauscht (und zurückgibt).

also etwa der form:
function tauschen(u,v)
{
var w;
w = v;
v = u;
u = w;
return 1;}

ich scheitere derzeit dran, dass in javascript die gatauschten zahlen offenbar nicht zurückgegeben werden.

seh ich das richtig?
tia
m.

)

Ich kenne keine Programmiersprache in der das so funktionieren würde.
u und v sind lokale Variablen der function tauschen.
Wenn diese in der Funktion getauscht werden, dann merkt der Aufrufer davon nix.
Selbst dann nicht, wenn es Variaben mit gleichem Namen ausserhalb der Funktion gibt.
In C könnte man das beispielsweise mit Zeigern machen:

void tauschen(int\* u,int\* v)
{
 int w;
 w = \*v;
 \*v = \*u;
 \*u = w;
}

In JavaScript gibt es aber keine Zeiger, sondern nur Referenzen.
Und dazu müsstest du dir erstmal OOP in JavaScript ansehen.
Falls das bereits geschehen sein sollte, dann ist die Lösung (analog zu Java) eigentlich einfach:

// Erstelle eine Klasse
function Variable(val) {
 this.value = val;
}

// Verwende 2 Referenzen auf Variablen
function tauschen(u, v)
{
 var w;
 w = v.value;
 v.value = u.value;
 u.value = w;
}
// Erzeuge 2 Objekte, speichere Referenzen in u und v
u = new Variable(1);
v = new Variable(2);
alert(u.value+" "+v.value);
// Tausche Werte(value)
tauschen(u,v);
alert(u.value+" "+v.value);

Alles klar?

Beste Grüße
Stefan

Hi,

Ich kenne keine Programmiersprache in der das so funktionieren
würde.

falls es dich interessiert: C++ kennt Referenzen; dort kann man in Anlehnung an dein C-Beispiel so etwas machen:

void tauschen(int& u,int& v)
{
int w;
w = v;
v = u;
u = w;
}

Andreas

Hallo,
die Aufgabe hieß: tauschen in JS und nicht „wie sieht das in C aus“. Okay?

Hier eine Lösung:

function tausche(u,v) {
a=v;
b=u;
return a, b;
}
var a=„a“, b=„b“;
document.write("vorher: a ist "+ a + " und b ist " + b + „<p>“);
tausche(a,b);
document.write("nachher: a ist "+ a + " und b ist " + b);

Hallo IST-Mainz,

die Aufgabe hieß: tauschen in JS und nicht „wie sieht das in C
aus“. Okay?

ja, okay. Schlecht geschlafen?

Hier eine Lösung:

Ich hoffe, das war nicht dein Ernst. (Falls doch: Tausche mal mit derselben Funktion die Variablen c und d statt a und b.)

Nichts für ungut; für mich hat VoidZer0 alles zum Thema Lösbarkeit gesagt, was es zu sagen gab.

Viele Grüße,

Andreas

Hallo IST-Mainz,
Genau wie Andreas schon sagte, ist das keine wirkliche Lösung.
Es ist quasi dasselbe, als würde man schreiben:

var u=1; var v=2;
function tausche() {
 var w = u;
 u=v;
 v=w;
}
tausche();

Es greift direkt auf die Variablen ausserhalb der Funktion zu,
so dass man auch auf die Funktion verzichten könnte,
da man eh nur 2 bestimmte Variablen tauschen kann.
Das return a,b; am Ende deiner „Lösung“ ist zudem irreführend,
da es zwar dort steht abr überhaupt nichts zur Vertauschung beiträgt.

Aber wenn es schon in JavaScript keine Möglichkeit gibt,
das in etwa so zu machen, wie es sich michael vorstellte,
warum sollte man dann nicht wenigstens mal erwähnen,
dass man es in anderen Programmiersprachen schon zumindestens so ähnlich umzusetzen kann?
Ein Blick über den Tellerrand kann ja eigentlich nicht schaden.
Die JavaScript-Frage haben wir ja trotzdem beantwortet
und man kann diese Lösung(Referenzen) auch überall anwenden,
wo man so etwas wie Zeiger bräuchte.
Und selbst, wenn du eine bessere/einfachere funktionierende Lösung gehabt hättest,
dann musst du doch wenigstens anerkennen,
dass wir uns zumindestens Mühe gegeben haben,
die Frage zufriedenstellend zu beantworten.
Deswegen, klang deine Antwort auch für meinen
Geschmackt ein bisschen unfreundlich.

@michael
Mir ist noch eine Lösung eingefallen, die evtl. etwas einfacher ist,
weil sie ohne Klassen auskommt.
Und zwar sind auch Arrays in JavaScript Referenzen
und wenn du einfach die Werte zweier ein-elementiger Arrays tauschst,
dann ändern sich die Werte auch für den Aufrufer:

// a und b sind Referenzen auf Arrays
function tausche(a,b) {
 var w=a[0];
 a[0] = b[0];
 b[0] = w; 
}
// Erzeuge zwei ein-elementige Arrays
var a = new Array(1);
var b = new Array(1);
a[0]=1;
b[0]=2;

alert(a[0] + " " + b[0]);
// tausche per Referenz:
tausche(a,b);
alert(a[0] + " " + b[0]);

Ich bin ziemlich sicher, dass es nicht noch einfacher in JS geht.

Lieben Gruß
VoidZer0

1 Like

Ach ja, evtl. hätt ich da noch eine Lösung, die zwar noch einfacher ist, aber als schlechtes Design gilt:

function tausche(x,y) {
 return [y,x];
}
var a = 1;
var b = 2;

alert("vorher: a ist "+ a + " und b ist " + b);
[a,b] = tausche(a,b);
alert("nachher: a ist "+ a + " und b ist " + b);

Das ist eigentlich auch kein richtiges Tauschen, sondern nur eine „Überkreuzzuweisung“ per Rückgabe-Tupel.

2 Like

THX
a lot
m

Hi,

Das ist eigentlich auch kein richtiges Tauschen, sondern nur
eine „Überkreuzzuweisung“ per Rückgabe-Tupel.

danke für den Hinweis; war mir gar nicht bewusst, dass Javascript das auch kann (neben Perl und Python zum Beispiel).

Ich persönlich würde mir dann die tauschen-Funktion komplett sparen. Einfacher und besser lesbar als so geht das Vertauschen kaum:

[a, b] = [b, a];

Andreas

PS: Zum Nachlesen für alle, die mitlesen: https://developer.mozilla.org/en/New_in_JavaScript_1…

Ich persönlich würde mir dann die tauschen-Funktion komplett
sparen. Einfacher und besser lesbar als so geht das
Vertauschen kaum:

[a, b] = [b, a];

Ja wohl wahr aber der gute Mann hatte sich nun mal auf ach und krach ne „Funktion“ gewünscht :wink:

PS: Zum Nachlesen für alle, die mitlesen:
https://developer.mozilla.org/en/New_in_JavaScript_1…

Ah jetzt weiß ich wieder, warum ich es sonst nie verwende:
Weil es mir bisher noch zu neu wahr und somit nicht von älteren Browsern verstanden wird aber da es nun inzwischen bald 4 Jahre alt wird, könnte man auch mal mit der Zeit gehen :wink:

V0id