kuriosität mit split()
Sorgenkind Mech
- javascript
hi nochmal
ich hab hier ne ganz kuriose sache, denn das script funktionierte vorher, und ich kann mich nicht erinner es geändert zu haben
beispiel:
var name="hans mustermann";
name = name.split(" ");
alert(name);
das alert gibt nun "hans,mustermann" aus, was natürlich nich mein verlangen war, ich wollte doch ein array?
jemand ne ahnung woran es liegen könnte?
dankend
Hallo Sorgenkind Mech,
alert(name[0]); -> hans
alert(name[1]); -> mustermann
Dieter
Sup!
Wie soll den das JS-Alert den Array darstellen, wenn nicht als Komma-separierte Liste aller Elemente?!?
Gruesse,
Bio
hi nochmal
ich hab hier ne ganz kuriose sache, denn das script funktionierte vorher, und ich kann mich nicht erinner es geändert zu habenbeispiel:
var name="hans mustermann";
name = name.split(" ");
alert(name);das alert gibt nun "hans,mustermann" aus, was natürlich nich mein verlangen war, ich wollte doch ein array?
jemand ne ahnung woran es liegen könnte?
dankend
aaalso, ich will ja nich unhöflich sein (ich bitte auch den kleinen angriff im topic zu verzeihen), aber das alert müsste [object] oder array oder sowas ausgeben, nicht aber einen string!
das problem is ja, dass die variable zu keinem array wird!
gruß
Hallo Sorgenkind Mech,
klar wird sie zum Array, sonst koennstest du die Elemente ja nicht mit name[0] ansprechen. Das Beispiel unten tut doch exakt, was es soll.
<html>
<head>
<script language="JavaScript" type="text/JavaScript">
<!--
function test(){
var name="hans mustermann";
name = name.split(" ");
alert (name); //ergibt hans,mustermann
alert(name[0]); // ergibt hans
alert(name[1]); // ergibt mustermann
}
//-->
</script>
</head>
<body onload="test()">
</body>
</html>
Dieter
Hallo Sorgenkind Mech,
klar wird sie zum Array, sonst koennstest du die Elemente ja nicht mit name[0] ansprechen. Das Beispiel unten tut doch exakt, was es soll.
genau da liegt das problem, es wird zum beispiel NICHT zum array, sondern bleibt ein string, und ich kann das ganze nicht mit name[0] ansprechen, denn dann bekomme ich "undefined";
<html>
<head>
<script language="JavaScript" type="text/JavaScript">
<!--
function test(){
var name="hans mustermann";
name = name.split(" ");
alert (name); //ergibt hans,mustermann
alert(name[0]); // ergibt hans
alert(name[1]); // ergibt mustermann
}
//-->
</script>
</head><body onload="test()">
</body>
</html>Dieter
hier mal die funktion:
function fuertext()
{
if(document.forms["dok"].ansprechpartnername.value!="" && document.forms["dok"].anrede.value!="")
{
var werte=document.forms["dok"].ansprechpartnername.value.split(":");
name=werte[0];
anrede=werte[1]
if(anrede=="Frau") { document.forms["dok"].genus.value="geehrte"; document.forms["dok"].anrede.value="Frau"; }
if(anrede=="Fa.") { document.forms["dok"].genus.value="geehrte"; document.forms["dok"].anrede.value="Fa."; }
if(anrede=="Herr") { document.forms["dok"].genus.value="geehrter"; document.forms["dok"].anrede.value="Herr"; }
if(anrede=="Familie") { document.forms["dok"].genus.value="geehrte"; document.forms["dok"].anrede.value="Familie"; }
if(!document.forms["dok"].vornamezeigen.checked)
{
name = name.split(" "); --> es existiert in dem string auf jeden fall ein leerzeichen!
alert(name); --> ergibt '<vorname>,<nachname>'
name = name[1]; --> ergibt "undefined"
if(!name) name=document.forms["dok"].ansprechpartnername.value.split(":")[0];
}
document.getElementById("kopftext").innerHTML="Sehr " + document.forms["dok"].genus.value + " " + document.forms["dok"].anrede.value + " " + name;
}
}
verzweifelter gruß
moin Sorgenkind,
Das Beispiel unten tut doch exakt, was es soll.
genau da liegt das problem, es wird zum beispiel NICHT zum array
Doch. Was sollte denn
var name="hans mustermann";
name = name.split(" ");
sonst tun? Alternativ kannst du natürlich auch
name = new Array("irgendwas","irgendwas","irgendwas")
schreiben. Dann wäre allerdings die vorhergehende Variable "hans mustermann" funktionslos, es sei denn, du schreibst für "irgendwas" eben "$name" (ist etwas komplizierter, kannst du unter http://selfhtml.teamone.de/javascript/objekte/array.htm nachlesen). Es wäre vielleicht auch hier angebracht, daß du etwas genauer beschreibst, was du eigentlich haben möchtest.
Und ich wiederhole meine Anmerkung von weiter oben: schau dir doch _bitte_ an, wie hier im Forum zitiert werden sollte. Das steht ausführlich und genau in der FAQ
Grüße aus Berlin
Christoph S.
moin Sorgenkind,
Das Beispiel unten tut doch exakt, was es soll.
genau da liegt das problem, es wird zum beispiel NICHT zum array
Doch. Was sollte denn
var name="hans mustermann";
name = name.split(" ");
sonst tun? Alternativ kannst du natürlich auch
name = new Array("irgendwas","irgendwas","irgendwas")
schreiben. Dann wäre allerdings die vorhergehende Variable "hans mustermann" funktionslos, es sei denn, du schreibst für "irgendwas" eben "$name" (ist etwas komplizierter, kannst du unter http://selfhtml.teamone.de/javascript/objekte/array.htm nachlesen). Es wäre vielleicht auch hier angebracht, daß du etwas genauer beschreibst, was du eigentlich haben möchtest.Und ich wiederhole meine Anmerkung von weiter oben: schau dir doch _bitte_ an, wie hier im Forum zitiert werden sollte. Das steht ausführlich und genau in der FAQ
Grüße aus Berlin
Christoph S.
aaaaaaaaaaalso, nix gegen dich direkt, aber ich scheine tags für unsichtbare texte mit einzubauen
ich schrieb mehrmals, dass das script eben das nicht tut, dass ich KEIN array erhalte, sondern ein string, und dass ich aber, wie es auch normalerweise sein sollte, ein array haben will
eine kleine beschreibung (wie gewünscht):
durch php wird ein select geschrieben, in dem sich mehrere ansprechpartner befinden, mit vor und zuname. die werte dieser optionen bestehen aus vor-, zuname, und der entsprechenden anrede
wird der ansprechpartner nun in diesem dropdown geändert, so wird dieser in ein textfeld geschrieben
jedoch wird vorher geprüft, ob der vorname mit hineingeschrieben werden soll, wenn nein, dann wird der namensstring halt anhand des leerzeichens in ein array gesplittet (bzw. sollte, es hat früher mal funktioniert, wüsste aber nicht, dass ich diese funktion mal geändert habe), dann der erste wert des arrays genommen, und als name verwendet
das soll da passieren ..........
ich hoffe ich habe mich gut ausgedrückt, ich habe mir mühe gegeben
schonmal dankend
morgens, Sorgenkind ...
[fullquoting abgeschnitten]
ich schrieb mehrmals, dass das script eben das nicht tut, dass ich KEIN array erhalte, sondern ein string, und dass ich aber, wie es auch normalerweise sein sollte, ein array haben will
ich denke bisweilen, ich könnte lesen. Darf ich mich ausnahmsweise mal selbst zitieren?
Alternativ kannst du natürlich auch
name = new Array("irgendwas","irgendwas","irgendwas")
eine kleine beschreibung (wie gewünscht):
durch php wird ein select geschrieben, in dem sich mehrere ansprechpartner befinden, mit vor und zuname. die werte dieser optionen bestehen aus vor-, zuname, und der entsprechenden anrede
Da fehlt nun wieder dein PHP-Code. Wenn du in PHP irgendwas andres definierst, kann dein zusätzliches Javascript sagen, was es möchte, es wird höchstwahrschenlich nicht berücksichtigt
wird der ansprechpartner nun in diesem dropdown geändert, so wird dieser in ein textfeld geschrieben
nette Idee. Aber wo ist dein Code, der es zeigt?
ich hoffe ich habe mich gut ausgedrückt
du wirst ganz langsam besser
ich habe mir mühe gegeben
Das habe ich nicht bezweifelt
aber jetzt wirds erstmal Zeit für die Heia. Menno, du müßtest ja in ungefähr vier Stunden wieder aufstehen und in die Schule tappeln, was sollen denn die Mädels in deiner Klasse sagen, wenn du mit dicken Augenringen angelatscht kommst?
Grüße aus Berlin
Christoph S.
moin
Alternativ kannst du natürlich auch
name = new Array("irgendwas","irgendwas","irgendwas")
unpraktisch, da variabel
eine kleine beschreibung (wie gewünscht):
durch php wird ein select geschrieben, in dem sich mehrere ansprechpartner befinden, mit vor und zuname. die werte dieser optionen bestehen aus vor-, zuname, und der entsprechenden anrede
Da fehlt nun wieder dein PHP-Code. Wenn du in PHP irgendwas andres definierst, kann dein zusätzliches Javascript sagen, was es möchte, es wird höchstwahrschenlich nicht berücksichtigt
wenn du 25,7 kb reinen quelltext haben möchtest .........
die werte werden schon richtig ausgelesen, das habe ich natürlich per alert überprüft
sprich: die funktion hat alle variablen, die sie auch braucht, und das in der richtigen form (beispielsweise mit nem leerzeichen zwischen name und vorname, wodurch das splitten ja überhaupt erst möglich ist)
aber jetzt wirds erstmal Zeit für die Heia. Menno, du müßtest ja in ungefähr vier Stunden wieder aufstehen und in die Schule tappeln, was sollen denn die Mädels in deiner Klasse sagen, wenn du mit dicken Augenringen angelatscht kommst?
die sind mir schnuppe, zumal ich ne freundin habe, und glücklich mit ihr bin
ich muss halt n bissl was schaffen, kann ich aber nich, wenn ich an solchen "kleinigkeien/kuriositäten" festhänge
schlaf gut
hi,
das alert gibt nun "hans,mustermann" aus,
macht es nicht. Er gibt '["hans","mustermann"]' aus, was Dir zeigen sollte, dass es sich sehr wohl um ein Array handelt.
Btw: "name" ist ein reserviertes Wort, und sollte niemals als Variablenname genutzt werden.
Gruesse Joachim
hi,
macht es nicht. Er gibt '["hans","mustermann"]' aus, was Dir zeigen sollte, dass es sich sehr wohl um ein Array handelt.
Btw: "name" ist ein reserviertes Wort, und sollte niemals als Variablenname genutzt werden.
grade gesehen: NC 4.7 gibt tatsaechlich ein String aus, wenn die JS-Version < 1.2 ist. Spezifiziere die JS-Version, also '<script language="javascript1.2" type="text/javascript">', dann machts auch NC 4x korrekt.
Gruesse Joachim
Hi!
aaalso, ich will ja nich unhöflich sein (ich bitte auch den kleinen angriff im topic zu verzeihen), aber das alert müsste [object] oder array oder sowas ausgeben, nicht aber einen string!
Wenn Du das willst, musst Du es auch sagen. Du willst den Typ feststellen, also fordere den Typ! Geht mit
alert(typeof(name));
So long
Moin Moin !
Punkt 1: Du recyclest die name-Variable, das ist zwar technisch kein Fehler, aber es ist unsauber. In Deinem langen Beispiel geschieht das auch noch in einem if-Block. Auweia! Nimm "var tmp" o.ä. wenn Du nur vorübergehend ein Array brauchst.
Punkt 2: Es gibt irgendwo in Javascript einen Automatismus (ist im SelfHTML-Kapitel zu Javascript beschrieben, finde ich gerade aber nicht), der Arrays in Strings umwandelt, indem er alle Array-Elemente mit Kommata verbindet. Das scheint hier zu passieren.
Alexander
hi nochmal
ich hab hier ne ganz kuriose sache, denn das script funktionierte vorher, und ich kann mich nicht erinner es geändert zu habenbeispiel:
var name="hans mustermann";
name = name.split(" ");
alert(name);das alert gibt nun "hans,mustermann" aus, was natürlich nich mein verlangen war, ich wollte doch ein array?
Das macht JS automatisch, wenn du ein Array ausgeben möchtest.
Bei mir funktioniert das folgende einwandfrei und es würde mich wundern, wenn es bei dir nicht täte.
var name="hans mustermann";
var arr = name.split(" ");
alert(arr[0] + '-' + arr[1]);
Struppi.
Moin!
beispiel:
var name="hans mustermann";
name = name.split(" ");
alert(name);das alert gibt nun "hans,mustermann" aus, was natürlich nich mein verlangen war, ich wollte doch ein array?
Ich habe ein wenig rumgespielt in meiner URL-Zeile. Ergebnis:
Das von dir beobachtete Phänomen ist so, wie es auftritt, offenbar korrekt. Schuld dürfte das implizite Typecasting sein, was Javascript anwendet.
Wenn du so vorgehst:
name0="hans mustermann";
name1=name0.split(" ");
alert (typeof(name1)); // ergibt "object"
alert (name1.length); // ergibt 2
alert (name1[0]); // ergibt "hans"
alert (name1[1]); // ergibt "mustermann"
alert (name1); // ergibt "hans,mustermann" !
dann ist alles so, wie du es willst.
Wenn du hingegen so vorgehst, also der Stringvariablen das Ergebnis der Split-Operation zuweist:
name1="hans mustermann";
name1=name1.split(" "); // Hier ist das Problem!
alert (typeof(name1)); // ergibt "string"
alert (name1.length); // ergibt 15
alert (name1[0]); // ergibt "undefined"
alert (name1[1]); // ergibt "undefined"
alert (name1); // ergibt "hans,mustermann" !
dann wird ganz offenbar von Javascript festgestellt, dass name1 (den Namen habe ich geändert, um Probleme mit reservierten Wörtern auszuschließen - er ist aber legal!) ein String ist - und einem String kann man nur wieder einen String zuweisen, also wird das Array der Split-Operation in einen String umgewandelt.
Das sind aber alles Dinge, die du durchaus selber hättest rausfinden können. :) Wie gesagt: Ich habe dazu nur ganz wenig in der URL-Zeile rumgespielt (vorne javascript: eingeben und dann nacheinander alle Befehle - fertig).
- Sven Rautenberg
Das sind aber alles Dinge, die du durchaus selber hättest rausfinden können. :)
ja da hast du recht ..............
vielen dank trotzdem, endlich jemand, der auch meinen "unsichtbaren" text lesen kann ;)
grüße
Hi there!
dann wird ganz offenbar von Javascript festgestellt, dass name1 (den Namen habe ich geändert, um Probleme mit reservierten Wörtern auszuschließen - er ist aber legal!) ein String ist - und einem String kann man nur wieder einen String zuweisen, also wird das Array der Split-Operation in einen String umgewandelt.
Ich weiss ja nicht, welchen Browser Du verwendest, um das zu testen, aber das widerspricht nicht nur jeglicher Logik, sondern auch dem praktischen Verhalten meines Mozilla 1.2.1. ;-)
var n1 = "hans mustermann"; n1 = n1.split(' '); alert(typeof(n1)); alert(n1.length); alert(n1);
ergibt bei mir "object", "2", und "hans,mustermann", wie man es erwarten sollte. Warum der Typ einer Variable nach rechts propagiert werden sollte, ist fuer mich nicht nachvollziehbar. Wenn man einen bestimmten Typ /erwartet/, muss man in JS immer selbst fuer die Konvertierung sorgen. Z.B. konvertiert die alert()-Funktion jedes ihrer Argumente mit *.toString() zu einem String, bevor es diese ausgibt. (Uebergabe von Funktionsparametern und Zuweisung einer Variable sind im wesentlichen dasselbe.)
Im uebrigen moechte ich feststellen, dass 'name' *kein* reserviertes Wort ist, wie es im Thread mehrfach geaeussert wurde. Es wird lediglich in der traditionellen DOM-Hierarchy an vielen Stellen als Eigenschaft verwendet. Das ist aber vom Standpunkt von JavaScript[1] aus genauso wie 'fussball' - irgendein Eigenschaftsname, aber nichts reserviertes oder sonstwie besonderes. Die einzige Stelle, wo 'name' meines Wissens innerhalb von JavaScript[1] auftritt, ist als Eigenschaft des Error-Objekts. Das ist zwar ein 'native object', das macht 'name' aber immer noch nicht zu etwas besonderem.
Man sollte allerdings keine *globale* Variable 'name' verwenden, da damit die Eigenschaft window.name ueberschrieben wird. (Der globale Namensraum und die window-Eigenschaften sind in den Browsern sinnbefreiterweise ueberlagert. Man hielt das wohl mal fuer "einfacher".)
[1] Gemeint ist die Sprache an sich, ohne die zusaetzliche Objekthierarchie aus dem Browser-Umfeld. Also das, was in ECMA-262 spezifiziert ist.
So long
Sup!
Mein Mozilla 1.3a ist auch der Meinung, daß das, was beim Split rauskommt, ein Object ist und zwei Elemente hat. Könnte also durchaus ein Array sein ;-)
Vielleicht benutzt das Sorgenkind ja so einen Wursti-Browser, der nicht mal den non-greedy-Operator '?' in RegExps unterstützt oder so... da können ja die dollsten Dinge passieren.
Aber wie auch immer, lassen wir das Sorgenkind halt etwas rumpoltern und "Antworten mit Qualität" suchen, die zu geben wir ja ganz offensichtlich (aus der Sicht des sprachbegabten Sorgenkindes) nicht in der Lage sind; darum wird das Sorgenkind auf absehbare Zeit auf konstruktive Antworten von mir verzichten müssen (meine erste Antwort im Thread fand ich konstruktiv).
Gruesse,
Bio
Moin!
Ich weiss ja nicht, welchen Browser Du verwendest, um das zu testen, aber das widerspricht nicht nur jeglicher Logik, sondern auch dem praktischen Verhalten meines Mozilla 1.2.1. ;-)
var n1 = "hans mustermann"; n1 = n1.split(' '); alert(typeof(n1)); alert(n1.length); alert(n1);
Du hast recht! Ich konnte mein berichtetes Verhalten tatsächlich mit deiner Zeile nicht nachvollziehen. Weder im Mozilla noch im (vorher von mir verwendeten) Opera.
Zu allem Überfluss klappte es dann mit meinen Variablennamen ebenfalls nicht mehr!
Aber mit der Variable "name" klappt es! Hehe!
Man sollte allerdings keine *globale* Variable 'name' verwenden, da damit die Eigenschaft window.name ueberschrieben wird. (Der globale Namensraum und die window-Eigenschaften sind in den Browsern sinnbefreiterweise ueberlagert. Man hielt das wohl mal fuer "einfacher".)
Und genau _das_ ist das Problem hier. "window.name" und "name" sind in diesem Anwendungsfall identisch. Und da window.name eine Eigenschaft von window ist, welche als String festgelegt ist, muss Javascript Zuweisungen auf diese Eigenschaft in einen String wandeln.
Wie gesagt: name ist _keine_ Variable, wenn man sowas macht:
name="hans mustermann"; name=name.split(" ");
(der Typ von name bleibt String)
name wird zur Variablen, wenn man sowas macht:
var name="hans mustermann"; name=name.split(" ");
(name wird zum Array)
Mit anders benannten Variablen geht es natürlich immer:
n1="hans mustermann"; n1=n1.split(" ");
(n1 wird zum Array)
Interessanterweise (naja, eigentlich nicht) kann man auch im dritten Beispiel mittels window.n1 auf die Variable n1 zugreifen - was durchaus Sinn macht, weil man nur so fenster- und framesübergreifend auf Variablen und Funktionen zugreifen kann (vgl. http://aktuell.de.selfhtml.org/tippstricks/javascript/fensterzugriff/index.htm ganz unten letztes "Beachten Sie" - dumm von mir, ich hab das selbst geschrieben... ;) ).
Was sollte man also beachten?
Man sollte im Hinterkopf behalten, dass alle Variablen, die man verwendet, nicht nur als "variable", sondern auch als "window.variable" angesprochen werden können. Und da das window-Objekt schon ein paar Eigenschaften mitbringt, gibt es naturgemäß immer schon ein paar Variablen, die man vielleicht besser nicht überschreiben sollte - siehe http://selfhtml.teamone.de/javascript/objekte/window.htm. Dazu gehören als potentiell beliebte Variablennamen unter anderem "name" und "status". Also Vorsicht! Man entgeht _diesem_ Problem, indem man seine Variablen _immer_ mit "var variable" deklariert. Dann wird ein eventuell vorhandenes Objekt überschrieben, man hat eine echte Variable. Allerdings hat man dann das andere Problem, dass man nicht mehr auf das überschriebene Objekt zugreifen kann. Wer also unbedingt eine Variable "status" benötigt und diese mit "var status='ein Text'" deklariert, kann danach nicht mehr auf window.status zugreifen, um die Statuszeile zu ändern. Finde ich ziemlich praktisch. :)
- Sven Rautenberg