Rolf B: (pseudo-)assoziative arrays in javascript: naming collisions mit methoden

Beitrag lesen

Hallo dedlfix,

Ja, Map gibt es auch.

Nein, Map gibt's genau dafür. Leider noch nicht sooo lange, aber immerhin kennt es der Internet Explorer 11 und darum sollte man dieses Objekt dringend empfehlen.

Der Begriff des assoziativen Arrays ist ohnehin fragwürdig. In PHP gibt's den, weil da der Array-Typ so weit gefasst ist, dass er als Hash oder Dictionary herhalten kann.

In JavaScript kann man plain objects verwenden, um Hashes oder Dictionaries zu implementieren, aber man darf nicht den Meißel als Schraubendreher verwenden (oder umgekehrt).

  • wenn man einen Hash als {} initialisiert, bekommt man einen Standard-Objektprototypen mit allen Konsequenzen. Das kann man vermeiden, wenn man myHash=Object.create(null) aufruft, das erzeugt ein Objekt ohne Prototyp. Dann gibt's keine störenden Properties mehr, aber auch kein Basis-Set an Methoden wie hasOwnProperty. Statt dessen muss man Object.hasOwnProperty.call(myHash, 'foo') aufrufen.
  • Einen Prototypen zu haben ist bequemer, aber dann darf man die Existenz eines Propertys nicht mit if (myHash['foo']) implementieren, sondern mit myHash.hasOwnProperty('foo'). Genau dafür ist die Methode da.

Wichtig ist aber die Erkenntnis, dass Plain Old Javascript Objects keine idealen Maps sind. Dafür gibt es das Map Objekt. Man muss gucken, welcher Browser welche Methoden unterstützt (bei MDN oder Kangax), und nach Bedarf Polyfills bereithalten.

Rolf

--
sumpsi - posui - obstruxi