Wenn null als Object definiert ist, dann ist es logischerweise auch der Platzhalter für ein Object.
Nein, dieser Schluss ist überhaupt nicht logisch. Eine solche Einschränkung besteht - wie gesagt - nicht per se und ich wüsste nicht, wieso man sie sich auferlegen sollte.
Erstmal ist null nicht »als Object definiert«. null ist ein Primitive vom Typ Null. Lediglich der typeof-Operator klassifiziert diesen Primitive als »object«. In jeder anderen Hinsicht ist es sprachintern kein Object.
»The ECMAScript language types are Undefined, Null, Boolean, String, Number, and Object.«
http://ecma262-5.com/ELS5_HTML.htm#Section_8
»A primitive value is a member of one of the following built-in types: Undefined, Null, Boolean, Number, and String«
http://ecma262-5.com/ELS5_HTML.htm#Section_4.2
»4.3.11 null value
primitive value that represents the intentional absence of any object value.
4.3.12 Null type
type whose sole value is the null value.«
http://ecma262-5.com/ELS5_HTML.htm#Section_4.3.11 f.
Gut, da steht »object value«, aber faktisch hat das keine Auswirkung, denn eine Variable/Eigenschaft hat in JavaScript keinen festen Typ.
Ja, und zwar immer dann wenn die Defintion sagt, dass die Funktion ein Objekt zurückgibt. Wenn dieses Objekt nicht erzeugt werden kann (oder nicht gefunden) wird null zurückgegeben.
Ja, das stimmt. Das DOM gibt m.W. nie null zurück, wenn ein Primitive erwartet wird. Die Erklärung dafür ist: Das DOM ist auf statisch getypte Sprachen wie Java ausgelegt. Da kann m.W. eine Methode immer nur einen Typ zurückgeben, und wenn es ein Object zurückgibt, dann kann es nur null zurückgeben, wenn es »kein Object« zurückgeben will. In ActionScript, einem statisch getypten ECMAScript-Ableger, ist es ähnlich (es sei denn, man verwendet als Typ »*«).
JavaScript ist aber nicht Java. Man kann null zurückgeben, wenn man »keinen Wert« zurückgeben will, selbst wenn der standardmäßige Rückgabewert z.B. ein String ist. Das halte ich auch für sinnvoll. Wenn ich z.B. eine Methode getString habe, dann ist zwischen "" und null ein Unterschied ums Ganze. "" heißt: ein leerer String, null: konnte den gewünschten Wert nicht ermitteln, nicht gefunden o.ä. undefined hieße: Die Methode hat gar keinen Rückgabewert.
Dagegen ist "kein Wert" undefined
undefined ist, wie du auch sagst, erst mal der Wert einer Variable, die noch keinen Wert bekommen hat. Ferner ist undefined ist der Rückgabewert von [[GetProperty]], wenn ein Objekt die angefragte Eigenschaft nicht besitzt.
Diese Bedeutung würde ich im Programm nicht »umdeuten«, z.B. indem undefined als Platzhalter verwendet wird.
var person = {
name : undefined /* noch nicht gesetzt */
};
person.name = window.prompt("Wie heißt du?");
Gut, in ECMAScript 3 ist es eh nur eine Konvention, solche Platzhalter anzugeben, schließlich sind sämtliche Objekte erweiterbar. In ECMAScript 5 ist das schon anders, denn man kann das Anlegen neuer Eigenschaften unterbinden.
Mathias