Hacker News new | comments | show | ask | jobs | submit login

I want to stress that the following will work, but get you in trouble. Javascript does not support associative arrays.

  var myData = new Array;

  myData['key1'] = 'value1';
  myData['key2'] = 'value2';
  myData['key3'] = 'value3';

  myData.length; //0

I would say that JS does support associative arrays, since it is the fundamental data type behind objects and arrays. Arrays are basically associative arrays, since the index is converted into a string and used as a key. E.g. myData[7] is equivalent to myData["7"].

The length property does not return the number of items in the array though. It returns the value of the key with the highest numerical value if parsed as a integer plus one.


I agree with this quote from the link:

>>> Moreover building a hash over an Array object is potentially dangerous. If anyone extends Array.prototype with enumerable properties (as, for example, the Prototype.js library does) these will be read in during for…in iterations, wreaking havoc with your logic (or at least requiring you to make use of the clunky hasOwnProperty method). Build hashes over Object and nothing else, since by convention Object.prototype is not augmented.


This is a gotcha in Lua, too, but there it makes a bit more sense - tables ("dicts", if you prefer) explicitly have a key/value part and an array part - if you have a table with keys 1* to N, it's handled internally as an array (with O(1) lookups), but #, the length operator, explicitly gives you the upper bound for the array portion. In practice, this isn't a big deal, since the very different performance etc. means that they're usually used in very different ways.

It sounds like Javascript has the same downside, but without any upside.

* Yeah, Lua is 1-indexed. Nothing's perfect. Lisp has all those parens, Python has the whitespace thing...you get over it. :)


No. The length property of an array returns the index of the last value, plus one. Objects are the associative arrays, but they do not have a length.

Arrays are numerically indexed, but if a keystring is a base-10 integer, it will get interpreted as an index. If not, the corresponding property of the array object will be returned instead.


Also you can use associate array notation to access an object property. Found this out after previously using eval to access a dynamic property name.


yes, that's right - item.akey is interchangeable with item['akey'], but the latter form accepts expressions as the key value.


Guidelines | FAQ | Support | API | Security | Lists | Bookmarklet | DMCA | Apply to YC | Contact