Hi Matthias
lass uns mal ein gängiges Idiom aus Perl (<5.10) als konkretes Beispiel nehmen, ein Konstruktor F der positionelle Parameter¹ bekommt, die wenn fehlend defaulted werden sollen.
repl> function F (a,b,c) {
this.a= (a !== undefined) ? a :"A";
this.b= (b !== undefined) ? b :"B";
this.c= (c !== undefined) ? c :"C";
}
repl> x = new F()
[object Object] — {a: "A", b: "B", c: "C"}
repl> x = new F("a")
[object Object] — {a: "a", b: "B", c: "C"}
repl> x = new F(null)
[object Object] — {a: null, b: "B", c: "C"}
repl> x = new F("a",undefined,"c")
[object Object] — {a: "a", b: "B", c: "c"}
Übergebe ich undefined oder fehlt eine Angabe wird der Wert mit einem Default ersetzt.
Um nur a und c zu übergeben brauche ich undefined für b!
Ich könnte jetzt zwar != statt !== schreiben um auch null zu defaulten, dann hätte ich aber keine Möglichkeit mehr null als "falsches" Objekt durchzureichen.
»»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.
Man hat so aber, aus Symetriegründen, immer einen "falschen" Wert für eine Typklasse.
wenn ich z.B. match aufrufe kann ich sichergehen dass alle Ergebnisse typeof "object" sind, auch wenn null zurückgegeben wird.
JS macht die Typprüfung nicht implizit aber vielleicht braucht man sie irgendwann explizit. Oder der Aufruf erfolgt aus ner typisierten Sprache wie Java?
Die "Praxis" null als gewolltes "undefined" zu nutzen hat sich vielleicht eingebürgert, dahingehend designt und vorgesehen wurde es aber nicht.
Ciao
Rolf
¹) ab mehr als 3 Argumenten sollte man lieber ein Hash mit benannten keys übergeben ... also F({a:"a",c:"c"})