Christian Kruse: Objekte?-Arrays?-Objekte?

Beitrag lesen

Hoi Calo,

Ein bisschen theoretisieren macht aber doch Spass ;-)

Und ist beim Loesen praktischer Probleme manchmal aeusserst vorteilhaft.

Genau.

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.

Der Unterschied ist aber durch die automagische Typenkonvertierung fast nicht gegeben,
siehe auch weiter unten.

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.)

Ich glaube nicht, dass JS sich ein benutzer-definiertes Objekt 'raussucht bzw. 'raussuchen
kann.

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 */ }

Ja, ok. Du hast wohl recht.

Ach ja, und es koennte sein, dass es den Basistyp Array gibt und den entsprechenden
Objekttyp. Da bin ich mir noch nicht sicher.

Das glaube ich ehrlich gesagt nicht.

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!

Nun, fuer ein Spielzeug ist sie ganz schoen maechtig. Ich hab sogar schonmal einen
Speicherzugriffsfehler mit JS produziert ,-)

Oder glaubst Du vielleicht, MS Access ist eine Datenbank? ;-)

Der Geist ist willig, aber das Fleisch ist schwach ;-))

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:

Nee, sind sie nicht. Die Normal-Form von Arrays sind nummerische, als Liste oder
als Speicherfeld implementiert.

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

Das finde ich weniger verwunderlich.

Man beachte das letzte number! Obwohl das Array spaetestens nach der a.jkl-Zuweisung
zweifellos ein assoziatives ist, wird "56" in eine Zahl konvertiert.

In JS gibt es in der Art keine rein assoziativen Arrays. Das hatten wir ja schon geklaert:
es sind Objekts-Eigenschaften.

Gruesse,
 CK