abfragen ob Variable existiert - welche Syntax?
Horst Nogajski
- javascript
Hallo zusammen,
Ich möchte in einem Javascript abfragen, ob eine Variable existiert.
In PHP würde man das mit folgender Syntax machen können:
if(isset($meineVariable)) ...
Aber wie geht das in JavaScript?
Bei:
if(meineVariable) ...
bekomme ich einen Error, wenn die Variable nicht existiert.
Das taugt nur, wenn die Variable zwar den Wert 0 hat, aber sie muß schon existieren.
Vielen Dank und viele Grüße,
Horst
PS: Wenn ein JavaScript-Experte dieses Posting liest, (und Fortuna mir heute gut gesonnen ist), ich hätte da noch eine Frage:
Gibt es in JavaScript auch so was wie in PHP das 'foreach' für die Abarbeitung eines ganzen Arrays, oder muß man das 'zu Fuß' machen, sprich erstmal sowas wie arraycount abfragen und dann eine For-Schleife nehmen?
Hallo Horst,
Variable auf gesetzt überprüfen:
if (meineVariable != null)
{alert(Variable hat einen Wert);}
else
{alert(Variable hat keinen Wert);}
mfG
Franzi
Hallo Franzi,
vielen Dank für deine Antwort,
_aber_
hast Du das selbst mal geprüft, ob das stimmt?
Oder habe ich die Frage nicht verständlich gestellt?
Ich würde gerne wissen, wie man überprüft ob eine Variable überhaupt schon als Variable existiert, (in PHP if(isset($meineVariable))...)
und _nicht_ ob sie einen _Wert_ hat oder _keinen_ ?!
Variable auf gesetzt überprüfen:
if (meineVariable != null)
{alert(Variable hat einen Wert);}
else
{alert(Variable hat keinen Wert);}
Wenn man vorher
var meineVariable;
oder var meineVariable = false;
oder var meineVariable = 0;
notiert, dann klappt das mit deiner 'Lösung'.
Dann klappts aber auch mit meiner (if(meineVariable) ... else ...)
Das ist nämlich das _selbe_! ;)
Wenn ich aber _ohne_ vorher zu notieren 'var meineVariable;' frage:
if(meineVariable)...
oder if(!meineVariable)...
oder if (meineVariable != null)...
oder if (meineVariable == null)...
Dann erhalte ich einen 'Error: meineVariable is not defined'
.. und das würde ich gerne vermeiden.
mfG
Franzi
Viele Grüße,
Horst
Hallo,
beim Zugriff auf eine Variable die nicht existiert wird normalerweise
eine Ausnahmebedingung ausgelöst, was man sich wiederum zu Nutzen machen kann.
function IsVar (varName)
{
var _tmp;
try
{
eval("_tmp = " + varName + ";");
return true;
}
catch (error)
{
return false;
}
}
z.B :
var str1 = "";
IsVar("str1"); //- true
IsVar("str2"); //- false
Wobei man beachten sollte, dass _tmp als Name eindeutig ist. Ich weiß aber nicht ob dass so in jedem Browser funktioniert. Eine
"richtige" Standardfunktion ist mir jedenfalls nicht bekannt.
Und bevor Du mich fragst ob ich dass ausreichend getestet habe, nein das habe ich nicht.
hth
juergen
Hallo,
beim Zugriff auf eine Variable die nicht existiert wird normalerweise
eine Ausnahmebedingung ausgelöst, was man sich wiederum zu Nutzen machen kann.
Warum denn so kompliziert machen, nimm die Abfrage mit
if(typeof variable != "undefined")
und schon ist man aus dem Schneider.
Gruß
ueps
Hallo,
das funktioniert so wahrscheinlich auch in 100% der Fälle aber
ich habe so meine Zweifel eine Existenzprüfung mit einer Typenprüfung
zu vollziehen, denn das funktioniert nur solange ich diesen
Typ, auf den geprüft wird, nicht existiert bzw. er der "Standardtyp"
ist, der bei einer internen Ausnahme zurückgeliefert wird.
Ich kenne aber auch nicht so gut die ECMA-Specs. Falls es dort so
festgelegt wurde dann kann man auch auf "undefined" prüfen. Bringt
sicherlich etwas an Performance;)
juergen
Hallo,
das funktioniert so wahrscheinlich auch in 100% der Fälle aber
ich habe so meine Zweifel eine Existenzprüfung mit einer Typenprüfung
zu vollziehen, denn das funktioniert nur solange ich diesen
Typ, auf den geprüft wird, nicht existiert bzw. er der "Standardtyp"
ist, der bei einer internen Ausnahme zurückgeliefert wird.
"undefined" ist in JavaScript der Typ für Variablen die nicht existieren, ich seh da kein Problem die Abfrage so zu gestalten.
Gruß
ueps
Hallo ueps,
Hallo juergen,
Das es so spannend sein kann, herauszubekommen, welche Variante zur Überprüfung der Existenz einer Variablen nun von Vorteil ist, hätte ich vor dieser Aktion nicht gedacht. ;)
Ich habe beide Varianten mal probiert, die Methode mit 'typeof undefined' im Vergleich zu der 'try + catch' Variante.
Sie funktionieren beide gut.
Ich habe 3 Variablen abgefragt, wovon die 1. existiert und einen Wert hat, die 2. nur deklariert ist, und die 3. schlichtweg fehlt. ;)
Wenn die Variable nicht existiert wird der Text ausgegeben:
'Variable existiert nicht'. (ist so ziemlich das zutreffendste *g*)
Das Gleiche gibts dann noch mal mit ArrayWerten.
(Und zum Schluß die Abfrage nach dem Array selber, nur mal so zum Test)
Die Variablen:
var MyVAR1 = 1;
var MyVAR2;
var MyArray = new Array();
MyArray['value1'] = 1;
MyArray['value2'];
Die Abfragen im Script:
für die typeof Variante:
if(typeof MyVAR1 == 'undefined')info += "Variable existiert nicht\n\r";
else info += MyVAR1 + "\n\r";
für die try + catch Variante:
if(isVar('MyVAR1'))info += MyVAR1 + "\n\r";
else info += "Variable existiert nicht\n\r";
nochmal die Funktion für try + catch:
function isVar(varName) {
var tempVar;
try {
eval("tempVar = " + varName + ";");
return true;
}
catch (error) {
return false;
}
}
Die Ausgabe:
<img src="http://www.nogajski.de/postings/existenzpruefung_von_variablen.jpg" border=0 alt="">
Jow, da kann man jetzt ins Philosophieren geraten &:-|
Pro & Contras:
Grundsätzlich für die typeof-Methode spricht, das Sie auch rückwärtskompatibel ist (NS4 etc).
und sie ist natürlich kürzer, wenn man nur mal eine Variable abfragen will.
wenn man einen Stapel abfragen will ist das wieder anders.
Die typeof-Methode erkennt auch lokale Variablen innerhalb einer Funktion, und gibt diesen dann den Vorrang vor gleichnamigen globalen Variablen.
Ob das ein Vorteil oder Nachteil ist hängt davon ab was man prüfen will ;)
Mit try + catch hingegen konnte ich nur globale Variablen erkennen.
try + catch erkennt den unterschiedlichen Status zwischen 'gar nicht da' und ohne Wert bei den Variablen (VAR2). Wobei das bei dem Array.Value3 vielleicht nicht ganz richtig ist (der existiert ja nicht, aber mit try + catch wird wohl das Array erkannt, aber kein Wert für Value3 gefunden. - oder so ähnlich :) )
typeof undefined ist etwas schlampig bei VAR2 und Array.Value2. Da meint es die existieren nicht. Die existieren schon, haben aber den Wert undefined (oder so ähnlich ;) ).
Wie auch immer, ... für die meisten Vorhaben sollte wohl eine der Varianten passen.
Viele Grüße,
Horst
Hallo!
Wo ist den if (!self.meineVariable) in Deiner Systematik, würde mich interessieren.
Btw hast Du diesen Thread schon entdeckt?
http://forum.de.selfhtml.org/archiv/2002/3/6850/
Clemens
Hallo Clemens,
Wo ist den if (!self.meineVariable) in Deiner Systematik, würde mich interessieren.
Ja, wo ist sie denn?
Btw hast Du diesen Thread schon entdeckt?
http://forum.de.selfhtml.org/archiv/2002/3/6850/
klick klick klick ... ?
http://forum.de.selfhtml.org/faq/#Q-19 *g*
Nein, hatte ich nicht gesehen. Vielen Dank für den Hinweis.
Aber wenn Du möchtest darfst Du das auch gerne selber mal testen (wenn es dich interessieren würde, s.o.).
Aber nicht vergessen, dein Ergebnis hier bekannt zu geben, klaro?
Viele Grüße,
Horst
PS:
<img src="http://www.nogajski.de/postings/existenzpruefung_von_variablen2.jpg" border=0 alt="">
Hallo Clemens,
Wo ist den if (!self.meineVariable) in Deiner Systematik, würde mich interessieren.
Ja, wo ist sie denn?
Sehr lustig!
Btw hast Du diesen Thread schon entdeckt?
http://forum.de.selfhtml.org/archiv/2002/3/6850/
klick klick klick ... ?
Wie kann ich Links und Grafiken in den Text einbinden?
^^^^
ansonsten, copy'n paste sagt Dir schon was, oder?
Nein, hatte ich nicht gesehen. Vielen Dank für den Hinweis.
Bitte, gerne geschehen; man macht sich ja manchmal die Mühe, im Archiv zu suchen, oder auch wo anders, wenn man was im Hinterkopf hat, wenn man darauf aber solchen Antworen bekommt, kann einem da schon die Lust vergehen :-(
Aber wenn Du möchtest darfst Du das auch gerne selber mal testen (wenn es dich interessieren würde, s.o.).
Du hast das Script fertig auf der Festplatte oder sonst wo, da ist es für Dich etwas weniger Aufwand als für mich... und vielleicht interessiert es Dich ja auch.
Aber nicht vergessen, dein Ergebnis hier bekannt zu geben, klaro?
Überlege mal, ob der Ton hier angemessen ist, oder arbeitest Du beim Bund, das würde es vielleicht noch erklären.
Clemens
Hallo Clemens,
Sehr lustig!
Finde ich auch. Aber Du lachst ja gar nicht wirklich?
^^^= scherzhaft
Wie kann ich Links und Grafiken in den Text einbinden?
^^^^
ansonsten, copy'n paste sagt Dir schon was, oder?
Es ging ja wohl nicht darum, ob ich weiß wie ich die Seite aufrufen kann, sondern es war als Frage/Hinweis gemeint, ob _Du_ weißt, wie man hier in Postings einen Link ausführbar gestalten kann.
Nein, hatte ich nicht gesehen. Vielen Dank für den Hinweis.
Bitte, gerne geschehen; man macht sich ja manchmal die Mühe, im Archiv zu suchen, oder auch wo anders, wenn man was im Hinterkopf hat, wenn man darauf aber solchen Antworen bekommt, kann einem da schon die Lust vergehen :-(
Das verstehe ich nicht. Was gefällt Dir denn nicht?
Also, ich glaube, ich bin im schlimmsten Fall nur mißverstanden worden. Das tut mir zwar leid, aber ich finde, ich hab's schon verständlich geschrieben.
Schau'n wir mal weiter *g* (<- das ist jetzt wieder scherzhaft gemeint, also lach mal, ... na? ... Na OK, ein schmunzelndes Zucken in den Mundwinkeln will ich gerade noch durchgehen lassen *g*)
Aber wenn Du möchtest darfst Du das auch gerne selber mal testen (wenn es dich interessieren würde, s.o.).
Du hast das Script fertig auf der Festplatte oder sonst wo, da ist es für Dich etwas weniger Aufwand als für mich... und vielleicht interessiert es Dich ja auch.
Hm, ich habe den kompletten Kram doch ins Posting geschrieben, zwar nur den Aufruf einer Variablen (was aber für deinen Test ja gereicht hätte) oder aber man kann die 2 Zeilen ja auch mehrfach kopieren. Und Du willst mir nicht wirklich erzählen, das Du nicht irgendwo eine lokal gespeicherte HTML-Datei besitzt, in die Du (ich zitiere: copy'n paste sagt Dir schon was, oder?), genau, mal die paar Zeilen hinein kopieren kannst und es aufrufen.
Aber nicht vergessen, dein Ergebnis hier bekannt zu geben, klaro?
Überlege mal, ob der Ton hier angemessen ist,
Klaro, den finde ich (auch jetzt noch) angemessen, es ist ein Hinweis darauf, das ich es gut fände, wenn Du etwas in der Sache noch unternimmst, das Ergebnis hier auch zu hinterlegen, damit alle, die das irgendwann noch mal finden auch was davon haben.
(Nun tu doch nicht so, als ob Du das nicht wirklich verstanden hättest, sowas finde ich nämlich unangebracht.)
oder arbeitest Du beim Bund, das würde es vielleicht noch erklären.
Ich hatte leider nicht mal das Vergnügen den Grundwehrdienst zu absolvieren, da ich KDV'ler bin. Habe statt dessen vielen alten Leuten die Zeit vertrieben und die Wohnungen aufgeräumt oder den Kühlschrank gefüllt, (und manchmal auch wieder beim leeren geholfen *g*)
Aber obwohl ich nicht dort war, bin ich mir ziemlich sicher, das dort kein Vorgesetzter einen Befehl (ich glaube, auf sows spielt deine Kritik an) als _Frage_ formulieren würde.
Hast Du das ? (= Fragezeichen) gesehen?
Und Dir ist auch klar, das sich zwischen dem ? und dem ! genau (234567890)oder("§$%&/()=) noch neun_weitere_Tasten befinden?
Die Wahrscheinlichkeit, das ich ein ! eingeben wollte und nur als Tippfehler ein ? eingegeben habe, tendiert daher gegen 0 (Null). Alles Klaro? ...
Viele Grüße,
Horst
PS: ... wenn nicht, dann schreib noch mal. (<- das meine ich jetzt nicht scherzhaft)
Moin moin!
- typeof undefined ist etwas schlampig bei VAR2 und Array.Value2. Da meint es die existieren nicht. Die existieren schon, haben aber den Wert undefined (oder so ähnlich ;) ).
Das macht in JavaScript-World aber keinen Unterschied.
Wie auch immer, ... für die meisten Vorhaben sollte wohl eine der Varianten passen.
Ich wuerde auf jeden Fall die typeof-Methode bevorzugen, vor allem, weil sie auch aeltere Browser beherrschen und man gerade dort des oefteren mal die Verfuegbarkeit von vordefinierten Variablen/Funktionen testen muss.
Sowas aehnliches wie foreach gibt's uebrigens auch in JS, es heisst dort for .. in. Funktioniert aber nur mit assoziativen Arrays zuverlaessig (also wo die einzelnen Eigenschaften per Name angesprochen werden; wird auch als Objekt bezeichnet).
http://docserv.calocybe.dyndns.org/specs/NetscapeCommunications/JavaScript13ClientReference/stmt.htm#1004815
So long
--
Invest in America - Buy a Congressman!
-- a slogan from http://www.evolvefish.com/
Hallo Juergen,
beim Zugriff auf eine Variable die nicht existiert wird normalerweise
eine Ausnahmebedingung ausgelöst, was man sich wiederum zu Nutzen machen kann.
function IsVar (varName)
{
var _tmp;
try
{
eval("_tmp = " + varName + ";");
return true;
}
catch (error)
{
return false;
}
}
z.B :
var str1 = "";
IsVar("str1"); //- true
IsVar("str2"); //- false
Jau, jetzt kann ich hier dank der Funktion mein Script (fast unverändert) per if(IsVar('meineVarible'))..
weiter nutzen, (bzw endlich fehlerfrei :)) )
Wobei man beachten sollte, dass _tmp als Name eindeutig ist. Ich weiß aber nicht ob dass so in jedem Browser funktioniert. Eine
"richtige" Standardfunktion ist mir jedenfalls nicht bekannt.
Und bevor Du mich fragst ob ich dass ausreichend getestet habe, nein das habe ich nicht.
Aber ich ;)
Es funktioniert gut.
Laut SelfHTML (s.u.) ab JavaScript 1.5 + N6
und bei mir per Test (Win NT) mit allen neueren Netscapes (6x Mozi K-Meleon) und auch IE 5.5 + 6!
... in SelfHTML habe ich entsprechendes gefunden, ganz direkt zum Thema:
http://selfhtml.teamone.de/javascript/beispiele/fehlerbehandlung_try_catch.htm
und der Artikel davor ist artverwand:
http://selfhtml.teamone.de/javascript/beispiele/fehlerbehandlung.htm
Vielen Dank,
Horst
Hallo,
Variable auf gesetzt überprüfen:
if (meineVariable != null)
{alert(Variable hat einen Wert);}
else
{alert(Variable hat keinen Wert);}
Oh, oh
Das klappt aber nicht wenn die Variable gar nicht existiert.
Versuchs mal so:
if (typeof myvar != "undefined")
alert('exist');
else
alert('doesn't exist');
Gruß
ueps
Hallo!
if(meineVariable) ...
»»
bekomme ich einen Error, wenn die Variable nicht existiert.
Das taugt nur, wenn die Variable zwar den Wert 0 hat, aber sie muß schon existieren.
versuche es einmal mit
if (!self.meineVariable) alert("Existiert nicht!");