Rolf B: Warum Objekt.property ==> undefined?

Beitrag lesen

Hallo dedlfix,

Mit Array hat das nichts zu tun, es ist nur dieselbe Syntax.

Jain. Ein „klassisches“ JavaScript Array ist ein Objekt. Objekte haben beliebig benannte Eigenschaften und können zur Laufzeit beliebig viele Eigenschaften hinzu bekommen[1]. Der Zugriff auf diese Eigenschaften erfolgt über die Punkt-Notation, wenn der Name der Eigenschaft ein gültiger JavaScript-Name ist, und sonst über die [] Notation.

Auftritt Array: Es tut all das. Der einzige Unterschied ist eine Eigenschaft length und eine Modifikation des [] Operators bei Schreibzugriffen: Er prüft, ob da ein Eigenschaftsname zugewiesen wird, der einen Array-Index darstellt, also einen unsigned integer (in Google V8 zumindest). Wenn ja, wird die length Eigenschaft auf den höchsten verwendeten Index gesetzt. GESPEICHERT werden alle Werte als reguläre Objekteigenschaften (man teste das mit Object.getOwnPropertyNames und einer Beobachtung des Speicherverhaltens bei einer Zuweisung an someArray[500000000])

Die neumodischen getypten Arrays sind anders. Das sind keine Objekte mit freien Eigenschaften, sondern Objekte mit einem Datenpool à la C für die Index-Eigenschaften. Man muss angeben, wie groß sie sein sollen, und bekommt dann einen Block RAM der genau das aufnehmen kann. Der [] Operator ist bei getypten Arrays modifiziert, dass er bei Index-Zugriffen auf den Datenpool zugreift. Mit new Int32Array(500000000) blase ich den RAM meines Chrome auf 2GB auf (und weil er bei mir 32-bittig läuft, ist new Int32Array(600000000) nicht drin). Vorteil ist aber, dass jeder Eintrag nur 4 Bytes braucht. Im „klassischen“ Array ist es deutlich mehr (Property-Objekt, Name, Wert). Aber auch getypte Arrays sind immer noch Objekte; greife ich auf Eigenschaften zu, die keinen Index darstellen, werden sie klassisch als Object Property gespeichert.

Rolf

--
sumpsi - posui - clusi

  1. Für einen gewissen Wert von „beliebig“ ↩︎