peterS.: "Arrayness vs Objectness" nach ECMA-262: 15.4.5.1 [[Put]] (P, V)

Beitrag lesen

gruss molily,

Hallo,

Ich muss nochmal Erbsen zählen. ;)

und mir bleibt mal wieder die nachlese ((:-(

Anscheinend ist ein Array in JS ein Object, dessen Feldnamen
"zufällig" rein numerisch und fortlaufend numeriert sind.

Ein Object ist eine Art ungeordneter Hash mit Name-Werte-Paaren,
soweit klar.

drueck Dich doch nicht so drum:

»Jedes JavaScript-[[Object]]-Objekt ist ein Hash. Jedes andere
   von [[Object]] verschiedene JavaScript-Objekt behält diese Hash-
   Funktionalität über den jeweils implementierten Datentyp hinaus.«

Ein Array ist ein solches Object und stellt *zudem* eine nummerierte,
geordnete Liste mit Elementen dar. ...

richtig.

Ein Array hat also beide Fähigkeiten voneinander *unabhängig*.
Und die eine Fähigkeit ist auch nicht über die andere umgesetzt.

korrekt.

Ein Array ist in zweifacher Hinsicht eine Listenstruktur, er besitzt
als Object eine ungeordnete Liste mit Membern identifiziert durch
Strings und als Array eine geordnete Liste mit Elementen identifiziert
durch Numbers.

... wobei die ECMAScript-spezifikation hier auf alle faelle
   gesunden menschenverstand widerspiegelt, denn genau das von
   Dir vermutete verhalten ...

Das heißt konkret, arr[1] = "wert" bewirkt etwas völlig anderes als
arr["1"] = "wert". Das erste erzeugt ein Array-Element mit dem Index 1,
welches kein Member (Unterobjekt) von arr ist. Das zweite erzeugt einen
Member namens »1«, kein Array-Element.

... wird ausdruecklich ausgeschlossen.

die browserhersteller haben "15.4.5.1 [[Put]] (P, V)" meinem verständnis
   nach »4. If P is "length", go to step 12.« und »12. Compute ToUint32(V).«
   richtig gedeutet und identisch implementiert.

bsp.:

~~~javascript (function () {

var arr = [];
     arr[2] = "zwei";

alert((typeof arr.toSource == "function") ? (arr.toSource()) : (arr));

arr["1"] = "eins";
     arr["2"] = "doppeltgemoppelt";

alert((typeof arr.toSource == "function") ? (arr.toSource()) : (arr));
     alert(arr[1]===arr["1"]);

arr.length = "2"; // this is [[PUT]] as well!

alert((typeof arr.toSource == "function") ? (arr.toSource()) : (arr));

arr["length"] = 4;
     arr["laenge"] = arr.length;

alert((typeof arr.toSource == "function") ? (arr.toSource()) : (arr));
     alert(arr.laenge)
   })();/*
   (function () {var arr = [];arr[2] = "zwei";alert((typeof arr.toSource == "function") ? (arr.toSource()) : (arr));arr["1"] = "eins";arr["2"] = "doppeltgemoppelt";alert((typeof arr.toSource == "function") ? (arr.toSource()) : (arr));alert(arr[1]===arr["1"]);arr.length = "2";alert((typeof arr.toSource == "function") ? (arr.toSource()) : (arr));arr["length"] = 4;arr["laenge"] = arr.length;alert((typeof arr.toSource == "function") ? (arr.toSource()) : (arr));alert(arr.laenge);})();
   */

  
   jedes ([[String]])-member wird intern sanft zur konvertierung gedraengt.  
   faellt es um, wird es den numerisch indizierten elementen zugeschlagen,  
   bleibt es standhaft, darf es sich weiterhin im kreis der anderen objekt-  
   eigenschaften tummeln.  
  
  

> Array-Elemente sind keine Member (Unterobjekte) des Array-Objekts. Ändert  
> man die Member, bleiben die Elemente unangetastet; ändert man die Elemente,  
> bleiben die Member unangetastet.  
  
   jo.  
  

> Ein Array ist nicht einfach ein Object, dessen Member numerisch  
> identifiziert werden und fortlaufend nummeriert sind. Sonst wäre  
> das hier schon ein halber Array:  
>   
> var obj = {  
>    1 : "a",  
>    2 : "b",  
>    3 : "c"  
> };  
>   
> Hier könnte ich auch auch obj[1] schreiben. »1« wäre hier aber kein  
> numerischer Index, sondern würde in einen String umgewandelt und würde  
> als Membername behandelt. Außerdem kann man diese Object-Struktur nicht  
> geordnet nach Membernamen durchlaufen. Mit einer for-in-Schleife bekommt  
> man die Member in willkürlicher Reihenfolge.  
>   
> Das nur als allgemeine Ergänzung, wahrscheinlich sage ich dir nichts neues. ;)  
  
   man kann es nicht oft genug wiederholen.  
  
  

> Mathias  
  
  
   so long - peterS. - pseliger@gmx.net  
  
  

-- 
»Because objects in JavaScript are so flexible, you will want to think differently about class hierarchies.  
Deep hierarchies are inappropriate. Shallow hierarchies are efficient and expressive.« - [Douglas Crockford](http://javascript.crockford.com/)  
  
ie:( fl:) br:> va:( ls:& fo:) rl:| n3;} n4:} ss:} de:µ js:} mo:? zu:]