Horst Nogajski: abfragen ob Variable existiert - welche Syntax?

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?

  1. Hallo Horst,

    Variable auf gesetzt überprüfen:

    if (meineVariable != null)
    {alert(Variable hat einen Wert);}
    else
    {alert(Variable hat keinen Wert);}

    mfG
    Franzi

    1. 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

      1. 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

        1. 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

          1. 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

            1. 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

              1. 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

                1. 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

                  1. 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="">

                    1. 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 ... ?

                      http://forum.de.selfhtml.org/faq/#Q-19   *g*

                      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

                      1. Hallo Clemens,

                        Sehr lustig!

                        Finde ich auch. Aber Du lachst ja gar nicht wirklich?

                        http://forum.de.selfhtml.org/faq/#Q-19   *g*

                        ^^^= 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)

                2. 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/

        2. 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

    2. 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

  2. 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!");