Dominik Berger: Verwendung von Konstanten?

Hy Leute,

ich habe eine große Anzahl von Konstanten, die ich in einer Anwendung auf verschiedenen Seiten abfragen möchte - gibt es in JavaScript überhaupt die Möglichkeit Konstanten zu verwenden, anstatt zig-Mal "FeldSowieso" in den Code zu schreiben?
Meinen Recherchen nach nicht - und wenn ja, was würdet Ihr empfehlen - einfach Varaiblen in einem externen Script deklararieren, das ich dann in alle Seiten einbinden? Ist das nicht zuviel Overhead dann?

Dadurch daß die JavaScript Engine ja ein INterpreter ist (oder?), hat man dann sowieso Overhead (falls man eben nicht immer wieder dieselben Strings hardcodet) weil bei jedem Aufruf einer Zeile in Echtzeit erstmal der einzusetzende INhalt geholt werden muß?

  1. Hallo Dominik

    ich habe eine große Anzahl von Konstanten, die ich in einer Anwendung auf verschiedenen Seiten abfragen möchte - gibt es in JavaScript überhaupt die Möglichkeit Konstanten zu verwenden, anstatt zig-Mal "FeldSowieso" in den Code zu schreiben?

    Konstanten gibt es nicht, da es keine Typisierung von Variablen gibt in JS. Du kannst dir aber problemlos Variablen definieren, die du dann einfach per Konvention nicht mehr aenderst, sondern nur verwendest.

    viele Gruesse
      Stefan Muenz

    1. ...keine Typisierung von Variablen gibt in JS

      Kannst du mir nochmal genauer erklären, was das heißt? Und kannst Du mir sagen, ob JS eine rein interpretierende Sparche ist, die also überhaupt nichts vorübersetzt, nur Zeile für Zeile vorgeht?

      Nur der Infohalber, das mit Konstanten habe ich jetzt.

      Viele Grüße dominik berger

      1. Hallo Dominik

        Kannst du mir nochmal genauer erklären, was das heißt? Und kannst Du mir sagen, ob JS eine rein interpretierende Sparche ist, die also überhaupt nichts vorübersetzt, nur Zeile für Zeile vorgeht?

        Naja, ich nehme an, du kennst z.B. C oder Pascal oder so was, wenn du nach Konstanten fragst. In C gibt es z.B. Variablentypen wie int oder float fuer Zahlen oder char fuer eine 1-Byte-Zahl bzw. ein Zeichensatz-Zeichen und char* als Zeiger auf eine Zeichenkette. Und eben auch const fuer Variablen, die nicht mehr veraendert werden koennen. Solche Dinge gibt es in JavaScript nicht. Du kannst eine Variable definieren, aber du kannst ihr zunaechst mal nicht sagen, ob der Inhalt eine Zahl, ein Zeichen oder eine Zeichenkette sein soll. Nur durch die Art der Initialisierung, etwa x=1 oder x="1", kannst du vorgeben, ob die Variable als Zahl oder Zeichenkette zu verstehen ist. Und im Verlauf der JavaScript-Prozedur kannst du mit Hilfe spezieller Funktionen wie eval(Wert) oder str(Wert) erwzingen, dass ein Wert auf jeden Fall als Zahl oder Zeichenkette interpretiert werden soll. Neben Zahlen und Zeichenketten kennt JavaScript auch noch Arrays und Objekte, aber Konstanten im Sinne von const nicht.

        Wie JavaScript genau interpretiert wird, kann ich dir auch nicht sagen. Es scheint mir aber schon so, als ob der JavaScript-Interpreter moderner Browser immer erst das ganze Script vor der Ausfuehrung mal probeweise checkt, um nach Syntax-Problemen zu suchen. Wenn die Syntax OK ist, legt er dann einfach zeilenweise los. Logische Laufzeitfehler oder andere Probleme wie Stack-Overflow in Folge hauefiger rekursiver Aufrufe erkennen die heutigen JS-Interpreter meiner Erfahrung nach leider erst, wenn das Malheur passiert ist, nicht vorher (das sind Dinge, da ist z.B. der Perl-Interpreter um Lichtjahre weiter).

        viele Gruesse
          Stefan Muenz

        1. Hallo Stefan!

          Wie JavaScript genau interpretiert wird, kann ich dir auch nicht sagen. Es scheint mir aber schon so, als ob der JavaScript-Interpreter moderner Browser immer erst das ganze Script vor der Ausfuehrung mal probeweise checkt, um nach Syntax-Problemen zu suchen.

          Na ich schaetze mal, er wird einfach am Anfang alles an Script parsen, also die eingegeben vom Programmierer (?) eingegeben Texte erkennen und evtl. in einer fuer den Interpreter besser lesbaren Form (binaer) ablegen und bei dieser Gelegenheit Syntaxfehler erkennen. Trotzdem kann er ja bei der Ausfuehrung zeilenweise vorgehen, inclusive der Pruefung, ob es eine aufgerufene Funktion ueberhaupt gibt. Jedenfalls liessen sich so imho am einfachsten solche Dinge implementieren wie
          if (document.images)   mach_was_mit_images();    (In mach_was_mit_images werden ja Dinge getan, die z.B. der IE3 gar nicht kann, trotzdem gibt es keine Fehlermeldung, er darf sich den True-Zweig also gar nicht so genau anschauen.)

          »»  Wenn die Syntax OK ist, legt er dann einfach zeilenweise los.

          Eben.

          Logische Laufzeitfehler oder andere Probleme wie Stack-Overflow in Folge hauefiger rekursiver Aufrufe erkennen die heutigen JS-Interpreter meiner Erfahrung nach leider erst, wenn das Malheur passiert ist, nicht vorher (das sind Dinge, da ist z.B. der Perl-Interpreter um Lichtjahre weiter).

          Das verstehe ich jetzt nicht. Logische Fehler kann der Interpreter doch eigentlich gar nicht erkennen, sie passieren einfach, oder? Oder was meinst Du jetzt damit?

          Calocybe

          1. Hallo Calocybe

            Das verstehe ich jetzt nicht. Logische Fehler kann der Interpreter doch eigentlich gar nicht erkennen, sie passieren einfach, oder? Oder was meinst Du jetzt damit?

            Da hast du Recht, logische Fehler erkennt auch der Perl-Interpreter nicht, das war etwas unklar ausgedrueckt. Aber er erkennt zum Beispiel Speicherplatzprobleme rechtzeitig und beendet laufende Scripts bei Ueberlauf oder dergleichen so, dass am Ende nichts kaputt geht, also z.B. gerade bearbeitete Dateien bleiben nicht in undefiniertem Zustand, sondern im Originalzustand vor Scriptaufruf. Meiner Erfahrung nach zumindest.

            viele Gruesse
              Stefan Muenz

        2. Besten Dank für die Erläuterung nochmal, JScript ist also ziemlich interpretierend und was seine Variabeltypen angeht, eher eingeschränkt. Naja, dann bastele ich alos mit den Varaiabeln als Konstanten und falls es Perforamnce-Probleme gäbe, tippe ich einfach die Strings direkt ein.

          Tschaui :-)

  2. gibt es in JavaScript überhaupt die Möglichkeit Konstanten zu verwenden, anstatt zig-Mal "FeldSowieso" in den Code zu schreiben?

    natürlich, schlicht in den Header oder in einer externen JS-Datei definieren:

    var x="Wert";

    und du kannst dann normal darauf zugreifen.

    Arbeitest du mit Frames, kannst du diese auch in einem Frame ablegen.

    Ist das nicht zuviel Overhead dann?

    verstehe ich nicht ganz, auch in anderen Programmiersprachen mußt du selbstdefinierte Konstanten
    deklarieren.

    Viele Grüße

    Antje

    1. var x="Wert";
      und du kannst dann normal darauf zugreifen.

      So hatte ich das angedacht, nur das ist dann - so weit ich sehe - eben keine Constante, sondern eine Variable: Und die hat mehr Overhead, weil die Engine davon ausgeht, daß sich so ein Ding mal ändern kann und das deswegen wohl intern anders anlegt, als wenn man so was z.B. mit einem Keyword wie 'static' bzw. 'final' festschreibt; dann ist genau klar, diese vier Bytes 'W' 'E' 'R' 'T', die werden so in der Reihenfolge von Zeit zu Zeit gebraucht und ändern sich nie.

      Ist das nicht zuviel Overhead dann?

      Das mit dem Overhead meinte ich bezogen auf den gerade angesprochenen Unterschied zwischen einer Varaiabeln- und einer Constanten-Deklaration.
      Und außerdem: Ich weiß nicht wie die JavaScript-Engine vorgeht, aber wenn sie z.B. nicht Zeile für Zeile Code liest und übersetzt, sondern ggf. Teile vorübersetzt, dann könnte sie hier die Konstanten direkt eintragen - das geht mit Variabeln nicht, da muß während der Ausführung der Zeile nachgeguckt werden, welcher Wert denn jetzt gerade in der Variabel steht und das dauert natürlich länger.
      So ist das bei compilierenden Sprachen - die schreiben die Konstanten fest in den compilierten Code rein, so daß zur Laufzeit da gar keine ProzessorAktivität außer dem Zuweisen nötig ist,

      So meinte ich das, wobei ich das angfragt habe, weil man auch immer mal wieder was neues dazu erklärt bekommen kann und weil ich nicht weiß ob JavaScript z.B. beim Interpretieren irgendwie optimiert.
      Kann mir das einer sagen?

      Vielen Dank aber für den Hinweis bzw. die Bestätigung, das mit dem var x = "wert" werde ich dann so machen.

      viele grüße dom

      verstehe ich nicht ganz, auch in anderen Programmiersprachen mußt du selbstdefinierte Konstanten
      deklarieren.

      Viele Grüße

      Antje

      1. Ist das nicht zuviel Overhead dann?
        Das mit dem Overhead meinte ich bezogen auf den gerade angesprochenen Unterschied zwischen einer Varaiabeln- und einer Constanten-Deklaration.
        Und außerdem: Ich weiß nicht wie die JavaScript-Engine vorgeht, aber wenn sie z.B. nicht Zeile für Zeile Code liest und übersetzt, sondern ggf. Teile vorübersetzt, dann könnte sie hier die Konstanten direkt eintragen - das geht mit Variabeln nicht, da muß während der Ausführung der Zeile nachgeguckt werden, welcher Wert denn jetzt gerade in der Variabel steht und das dauert natürlich länger.

        Deine Überlegung ist im Prinzip richtig.

        Sie ist in der Praxis aber kaum relevant:
        1. wirst Du wahrscheinlich kein typisches number-cruncher-Problem ausgerechnet mit JavaScript lösen wollen, sondern lediglich Abfragen, String-Manipulationen, letzten Endes eine sequentielle Verarbeitung erledigen wollen.
        2. Wenn diese sequentielle Verarbeitung so lang laufen würden, daß Du Dir über den Unterschied zwischen Konstanten und Variablen Gedanken machen müßtest, wie groß müßte dann das JavaScript-Programm sein, und wieviele Stunden hätte Dein Besucher auf den Download der HTML-Seite warten müssen?

        Verglichen mit Leitungsgeschwindigkeiten sind Interpretersprachen auf modernen Rechnern so schnell, daß man darüber nicht mehr nachdenken muß - zumal der Rechner des Clients außer dem Browser wahrscheinlich nicht viel gleichzeitig zu tun hat.
        Bei CGI-Anwendungen auf einem Server, auf den vielleicht tausende von Besuchern gleichzeitig zugreifen, also bei Perl etc., wäre Deine Frage sehr viel berechtigter.

        1. Wenn diese sequentielle Verarbeitung so lang laufen würden, daß Du Dir über den Unterschied zwischen Konstanten und Variablen Gedanken machen müßtest, wie groß müßte dann das JavaScript-Programm sein...

          Verglichen mit Leitungsgeschwindigkeiten sind Interpretersprachen auf modernen Rechnern so schnell, daß man darüber nicht mehr nachdenken muß

          So wie Du das sagst, stimmt das bestimmt - es handelt sich bei mir um Tabellen, die ich fülle bzw. wo ich die Validität abfrage - da kommen schon mal 400-500 Abfragen zusammen, weil ich die SDinger nicht beim Editieren sindern im Block checken will.
          Leitungsprobleme haben wir nur begrenzt, weil der datenfluß irgendwie zusätzlich ducrh einen zweiten TCPIP-Kanal programmiert ist - wenn ich jetzt für alle 25 Felder so eine Pseudo-Konstante-Varaiable verwende, na dann bekomme ich automatisch Bauchschmerzen -'so was macht man doch nicht' - , aber wahrscheinlich hast Du recht, daß das letztlich nicht ins Gewicht fällt. Besten Dann nochmal, Domi B

  3. ich habe eine große Anzahl von Konstanten, die ich in einer Anwendung auf verschiedenen Seiten abfragen möchte - gibt es in JavaScript überhaupt die Möglichkeit Konstanten zu verwenden, anstatt zig-Mal "FeldSowieso" in den Code zu schreiben?

    Was Du haben willst, sind Makros, oder? Irgendwo in einem Headerfile Symbole fuer Konstanten (oder idealerweise CommonCode) definieren, die Du dann dort ohne Aufwand verwalten kannst.
    Ich glaube nicht, dass JavaScript das unterstuetzt. Du wirst wohl ueber Variable gehen muessen.

    Wenn jemand eine Loesung fuer JavaScript Makros hat, waere ich auch sehr interessiert. Meine Loesung fuer den CommonCode ist, ihn ueber eine JaveScript Funktion (per document.write) zu erzeugen - nicht unbedingt ideal ;-)

    Na, eine 'Antwort' war das ja nun nicht grade ...

    Gruss,
    Angel

    1. einem Headerfile Symbole fuer Konstanten (oder idealerweise CommonCode) definieren, die Du dann dort ohne Aufwand verwalten kannst.

      Genau! ohne viel Aufwand verwalten und ändern, das ist der Punkt - ich werde ein exterens Script nehmen, daß ich dann in alle betroffenen Seiten einbinde und die Varaiabeln dann alle so deklarieren:

      var ZUM_BEIPSIEL = "zb"
      var "FELD_SPORTART" = "F1"

      das wird den Dienst erfüllen, aber es sind zig varaibeln, die ich so meinem Code aufzwinge, damit ich die Strings nicht jedesMal einzeln tippen muß und ggf. schnell ändern könnte.

      Danke jedenfalls für den seelisch-programmatischen Beistand.
      dominik