Hacker News new | past | comments | ask | show | jobs | submit login
Understanding JavaScript Arrays (javascriptweblog.wordpress.com)
34 points by heseltine on July 24, 2010 | hide | past | favorite | 14 comments



Isn't this faster for iterating over the elements:

  var a = ["banana", Math.min, 4, "apple"];
  for (var i=a.length; i; i--) {
    console.log(a[i]);
  }


Actually, I just realized this does not work, there is an off by 1 error here. jacksoncarter's piece of code works though.


Or try this

  var i = a.length;
  while (i--){
    console.log(a[i]);
  }


Clever, but sometimes you don't want to go in reverse.


Yes, in a micro-optimized way.


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.


forEach,map, and several other ECMA5 methods look like a joy to use


This isn't your father's Array. Sigh.




Consider applying for YC's W25 batch! Applications are open till Nov 12.

Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: