Hallo,
Aber mit if(variable) gehts gar nicht, oder?
Kommt darauf an.
Wenn du objektname außerhalb von typeof() irgendwo notierst und es gibt im aktuellen Geltungsbereich (Scope) kein Objekt mit diesem Namen, gibt es einen Scriptfehler.
Das gilt aber nicht, wenn man elternobjekt.objektname notiert, dann liefert dieser Ausdruck einfach den Wert undefined (=== undefined, siehe unten), aber keinen Scriptfehler.
Im globalen Geltungsbereich kann man also if (!window.objektname) notieren, weil jede globale Variable ein Unterobjekt von window ist. Da braucht man typeof() nicht notwendigerweise. Dasselbe gilt für alle anderen Fälle, in denen das Elternobjekt ansprechbar ist.
alert(window.foo); // undefined, also geht auch if (!window.foo)
alert(typeof(window.foo)); // undefined
alert(window.foo === undefined); // true
alert(foo); // JavaScript-Fehler
alert(typeof(foo)); // undefined
alert(foo === undefined); // JavaScript-Fehler
In Funktionen kann man auf den lokalen Geltungsbereich nicht über ein bestimmtes Objekt zugreifen kann. Dort muss man typeof() verwenden, wenn man die Existenz einer lokalen Variable in Erfahrung bringen will.
Das gilt nicht, wenn das Objekt ein Parameter in einer Funktion ist, der kein entsprechender Parameter übermittelt wurde. Dann gilt auch === undefined.
function f (param) {
alert(param); // undefined, also geht auch if (!param)
alert(typeof(param)); // undefined
alert(param === undefined); // true
// Aber wie gehabt:
alert(foo); // JavaScript-Fehler
alert(typeof(foo)); // undefined
alert(foo === undefined); // JavaScript-Fehler
}
Ergo: Nicht für alle objektname, für die gilt typeof(objektname) == "undefined", gilt auch objektname === undefined (d.h. höchstens elternobjekt.objektname === undefined, siehe oben). Das Schlüsselwort undefined bedeutet bei objektname === undefined soviel wie »ohne Wert initialisiert«. var objektname; führt auch zu objektname === undefined.
Eine andere Abhilfe wäre, alle Variablen als Eigenschaft des Objekts zu speichern, dessen Methode das Function-Objekt ist (this.eigenschaft = wert). Da gewöhnliche Funktionen wiederum Methoden des window-Objektes sind, sind diese öffentlichen Eigenschaften gewöhnliche globale Variablen, die am window-Objekt haften. Das will man natürlich selten. Deshalb nutzt man lieber eigene Objekte, die Methoden und Eigenschaften beherbergen, ohne den globalen Scope zu »verseuchen«.
Mathias