Huhu!
Ein bisschen theoretisieren macht aber doch Spass ;-)
Und ist beim Loesen praktischer Probleme manchmal aeusserst vorteilhaft.
In JS sind auch Integer und Strings Objekte.
Nicht zwingend. Es gibt einerseits die ordinaeren Typen Number und String, andererseits auch Number-Objekte und String-Objekte.
Oder wie erklaerst du dir sonst folgendes:
var stringob = "ganz langer string";
alert(stringob.length);
alert(stringob.indexOf("g"));
Vielleicht besonders automagische Typkonversion? (Normalerweise wuerde man trotz der automatischen Konversion nicht erwarten, dass JS sich irgendein Objekt raussucht, das zufaellig diese Eigenschaften hat. Daher denke ich, sind die eingebauten Objekte schon etwas bessergestellt als normale.)
Jedenfalls sehe man sich z.B. das an:
a = "foo"; b = new String("foobar");
alert(a.length); alert(b.length);
alert(typeof(a)); alert(typeof(b));
Ergibt: 3/6/string/object
Das finde ich ueberigens sehr konsequent, im Gegensatz zur grossen Schwester Java: dort
*gibt* es noch elementare Datentypen.
Hier eben auch. Und das kann Fallen in sich bergen. Fuer Boolean gilt dasselbe wie Number, es gibt einen Basistyp und einen Objekttyp. Und dann kommt sowas raus:
a = true; b = new Boolean(true);
if (a) { /* wird ausgefuehrt */ }
if (b) { /* wird nicht ausgefuehrt */ }
Ach ja, und es koennte sein, dass es den Basistyp Array gibt und den entsprechenden Objekttyp. Da bin ich mir noch nicht sicher.
Neee, mich stoert was komplett anderes: wieso zum Teufel sind alle Objekts-Eigenschaften
und -Methoden public? Das widerspricht dem OO-Prinzip doch wohl voellig.
JS ist doch keine richtige OO-Sprache. Es ist nicht mehr als ein Spielzeug! Oder glaubst Du vielleicht, MS Access ist eine Datenbank? ;-)
Denn das geht auch:
var blah = new Array();
blah[0]="abc";
alert(blah["0"]);
Natuerlich geht das: es wird beim []-Operator eine INT-Zahl erwartet und dadurch verursachst
du einen impliziten Typecast.
Ich wuerde nicht sagen, dass da ein Int erwartet wird, eben weil Arrays ja normalerweise assoziative sind. Aber folgendes scheint Dir recht zu geben:
a = ["x", "y", "z"]; a.jkl = "xyz"; a["56"] = "foo";
for (var i in a) alert(typeof(i));
alert(a.length)
Ergibt: number/number/number/string/number/57
Man beachte das letzte number! Obwohl das Array spaetestens nach der a.jkl-Zuweisung zweifellos ein assoziatives ist, wird "56" in eine Zahl konvertiert.
So long