Immeditate Function – Sebastians Blog https://sgaul.de Neues aus den Softwareminen Thu, 13 Mar 2014 20:34:50 +0000 de-DE hourly 1 https://wordpress.org/?v=6.1.1 https://sgaul.de/wp-content/uploads/2019/02/cropped-sgaul-2-1-32x32.jpg Immeditate Function – Sebastians Blog https://sgaul.de 32 32 Konstanten in Javascript https://sgaul.de/2012/05/23/konstanten-in-javascript/ https://sgaul.de/2012/05/23/konstanten-in-javascript/#comments Wed, 23 May 2012 18:48:56 +0000 https://sgaul.de/?p=1200 Eigentlich ist es keine Überraschung, wenn eine Programmiersprache Konstanten unterstützt. Bei Javascript bin ich zuvor aber nie darüber gestolpert: const.

Chrome- und Firefox-Verhalten nicht konstant

Ich habe mal einen kleinen Test in Chrome und Firefox gemacht. Im Normalfall verhalten sich beide, wie man es erwartet. Versucht man jedoch nachträglich eine Variable in eine Konstante zu verwandeln, reagieren die beiden unterschiedlich: Chrome ignoriert das „const“ und setzt den neuen Wert, während Firefox einen Fehler meldet und den neuen Wert ignoriert. Zumindest bleibt in beiden Fällen eine Variable variabel.

const a = 1;
a = 2;
console.log(a); // 1

const b = { b : 2 };
b = 3;
console.log(b); // Object { b=2}

var c = 3;
const c = 4; // Chrome: okay / FF: "TypeError: redeclaration of var c"
console.log(c); // Chrome: 4 / FF: 3
c = 5;
console.log(c); // 5

Scoping wie bei var

Bei der Sichtbarkeit verhält sich const genau wie var: Konstanten sind innerhalb von Funktionen beliebig tief sichtbar, außerhalb jedoch nicht.

(function() { const c1 = 1; console.log(c1); }()); // 1
console.log(c1); // ReferenceError: c1 is not defined

Ohne Scope werden Konstanten wie auch Variablen eine Eigenschaft des aktuellen Windows:

const c2 = 2;
console.log(window.c2); // 2
]]>
https://sgaul.de/2012/05/23/konstanten-in-javascript/feed/ 8
Komplexe Javascript-Datenstrukturen als String darstellen https://sgaul.de/2012/03/14/komplexe-javascript-datenstrukturen-als-string-darstellen/ https://sgaul.de/2012/03/14/komplexe-javascript-datenstrukturen-als-string-darstellen/#comments Wed, 14 Mar 2012 14:21:37 +0000 https://sgaul.de/?p=1078 Zwar bieten Firebug und Co. viele und mittlerweile auch richtig gute Wege an, wie man Javascript und auch darin auftretende Variablen debuggen und inspizieren kann. Leider hat man diese Möglichkeit nicht immer zur Hand. In meinem derzeitigen Projekt logge ich etwa direkt in die Konsole – hier ist also Handarbeit gefragt, wenn man etwas mehr über ein komplexes Objekt wissen möchte.

Menschenlesbares toString

Die folgende Funktion formt beliebig komplexe Datenstrukturen in einen String um, den man anschließend etwa mittels dump ausgeben kann.

function toString(obj) {
  return (function traverse(obj, depth) {
    var type   = typeof obj,
        string = '',
        indent = '',
        i;
    for (i = 0; i < depth; i += 1) indent += '  ';
    if (type === 'undefined') string += 'undefined';
    else if (obj === null) string += 'null';
    else if (type === 'object') {
      if (Object.prototype.toString.call(obj) === '[object Array]') { // array
        var length = obj.length, i;
        string += '[\n';
        for (i = 0; i < length; i += 1) {
          string += indent + '  ' + traverse(obj[i], depth + 1) + ',\n';
        }
        string += indent + '](' + length + ')';
      } else { // normal object
        var prop;
        string += '{\n';
        for (prop in obj) {
          if (obj.hasOwnProperty(prop)) {
            string += indent + '  ' + prop + ': '
                      + traverse(obj[prop], depth + 1) + ',\n';
          }
        }
        string += indent + '}';
      }
    }
    else string += obj;
    return string;
  }(obj, 0));
}

Die Funktion definiert eine neue Funktion, die für die Rekursion benötigt wird und direkt aufgerufen wird. Dieses Muster ((function(){ /* ... */ }());) ist als Immediate Function bekannt. Dann wird einfach geprüft, welcher Datentyp vorliegt und ggf. rekursiv der Wert in den String gepackt.

Für den Array-Test habe ich mich für Object.prototype.toString.call(obj) === '[object Array]' entschieden. Dieser Test ist absolut zuverlässig und im Gegensatz zum Array.isArray(obj) aus dem ECMA-Script-5-Standard überall vorhanden. Laut MDN ist Array.isArray erst im Internet Explorer 9 implementiert.

Anwendung

Mit dieser Funktion kann man sich nun eine beliebige Log-Funktion zusammenbauen:

function log(message) {
  dump(toString(message));
}

Im Ergebnis kann das ganze dann etwa so aussehen:

{
  a: true,
  b: 42,
  c: hallo,
  d: {
    e: 100,
  },
  f: [
    1,
    2,
    3,
    true,
    false,
    a,
  ](6),
  g: {
    h: {
      i: {
        j: 1,
      },
    },
  },
}
]]>
https://sgaul.de/2012/03/14/komplexe-javascript-datenstrukturen-als-string-darstellen/feed/ 2