Kurtz entgegnet :-)
Ich sage nur wer Array sagt muss auch Hash sagen.
Oder sieht jemand ein Argument gegen Object() als Hashersatz das nicht auch gegen Array() vorgebracht werden kann?
Ja: Es ist wie gesagt die length-Eigenschaft, die ein Array auszeichnet und damit verbunden die Möglichkeit, die Array-Elemente mit for(...) und numerischen Indizes zu durchlaufen, wie sich das für Array gehört. for-in ist dafür *nicht* gedacht und auch *nicht* wirklich geeignet, aus dem gleichen Grund, warum ein Objekt eben nicht einfach als Hash oder "assoziatives Array" bezeichnet werden sollte, d.h. wegen möglicher zusätzlicher Eigenschaften im Prototyp.
Die length-Eigenschaft eines Array lässt sich nämlich nicht austricksen durch etwas wie Object.prototype[99] = "bla"; vor dem Erzeugen neuer Arrays. Das hundertste Element dann allerdings schon: Wenn man anschließend z.B. var array = new Array(100); notiert, wäre array[99] eigentlich undefined, täuscht aber ganz frech "bla" vom Prototyp vor.
Analog lässt sich die Länge eines Hashs z.B. in Perl einfach ermitteln durch Zählen der Elemente: my $size = scalar(keys %hash);
Ein for..in über die Eigenschaften eines JavaScript-Objekts ist da aber nicht zuverlässig.
Zusammenfassend kann man also sagen:
Wenn es in JavaScript keine prototypische Vererbung gäbe und nicht alles außer Primitives Objekte wären, wäre ein JS-Array ein herkömmlicher Array und ein mit new Object() erzeugtes JS-Objekt ein herkömmlicher Hash.
Oder anders formuliert: Da JavaScript prototypische Vererbung kennt mit allem, was kein Primitive ist, gibt es in JS kein herkömmliches Array und auch keinen herkömmlichen Hash.
Das war jetzt aber eine schwere Geburt bis hierhin, oder bist du noch immer nicht zufrieden?
Gruß, Don P