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

Beitrag lesen

gudn tach!

nach vielen jahren muss ich mich mal wieder mit js beschaeftigen und fuehle mich soo doof.

assoziative arrays sind in js wohl objekte (oder umgekehrt, je nach sichtweise). das kann, wenn man hashes/maps von anderen sprachen wie perl oder c++ kennt, zu unerwarteten ergebnissen fuehren.

der code-schnipsel

var some_object = {};
some_object['init'] = true;
if(some_object['constructor']){
  destroy_earth();
}

wuerde (wenn die funktion destroy_earth korrekt implementiert ist), fatale folgen haben.

denn some_object besitzt als objekt standardmaessig die methode constructor (sowie weitere methoden wie toString etc.)

im konkreten fall koennte ich durch explizites abfragen den code wohl retten:

var some_object = {};
some_object['init'] = true;
if(some_object['constructor'] === true){
  destroy_earth(); // wird nun nicht mehr aufgerufen
}

oder ich mach's noch expliziter:

var some_object = {};
some_object['init'] = true;
const key = 'constructor';
if(Object.keys(some_object).includes(key) 
    && some_object[key] === true){
  destroy_earth();
}

aber so richtig sauber sieht mir das noch nicht aus -- geschweige denn elegant.

was waere denn in modernem javascript (und ohne jquery oder andere libs) ein sauberer weg, hashes/maps nutzen zu koennen, sodass ich mir keine gedanken darueber zu machen brauche, ob evtl. bereits eine methode existiert, die den gleichen namen traegt wie ein key eines key-value-pairs?

prost

seth