Does the "for…in" loop in Javascript loop through the hashtables/elements in the order they are declared? Is there a browser which doesn't do it in order?
The object I wish to use will be declared once and will never be modified.
Suppose I have:
var myObject = { A: "Hello", B: "World" };
And I further use them in:
for (var item in myObject) alert(item + " : " + myObject[item]);
Can I expect 'A : "Hello"' to always come before 'B : "World"' in most decent browsers?
The elements of an object that for/in enumerates are the properties that don't have the DontEnum flag set. The ECMAScript, aka Javascript, standard explicitly says that "An Object is an unordered collection of properties" (see http://www.mozilla.org/js/language/E262-3.pdf section 8.6).
It's not going to be standards conformant (i.e. safe) to assume all Javascript implementations will enumerate in declaration order.
The order cannot be trusted. Both Opera and Chrome return the list of properties unordered.
The code above shows B, A, C in Opera and C, A, B in Chrome.
This does not answer the question per se, but offers a solution to the basic problem.
Assuming that you cannot rely on order to preserved, why not use an array of objects with key and value as properties?
Now, it is up to you to ensure that the keys are unique (assuming that this is also important to you. As well, direct addressing changes, and for (...in...) now returns indexes as 'keys'.
See the Pen for (...in...) addressing in order by JDQ (@JDQ) on CodePen.Bumping this a year later...
It is 2012 and the major browsers still differ:
gist or test in current browser
Safari 5, Firefox 14
Chrome 21, Opera 12, Node 0.6, Firefox 27
IE9
Iteration order is also confused with respect to deleting of properties, but in this case with IE only.
The desire for changing the spec to fix the iteration order seems to be quite a popular desire among developers if the discussion at http://code.google.com/p/v8/issues/detail?id=164 is any indication.
in IE6, the order is not guaranteed.