for-in evaluation order

Allen Wirfs-Brock allen at wirfs-brock.com
Mon Dec 27 09:00:38 PST 2010


And I don't believe that anybody on this thread yet mentioned the impact of inherited properties on enumeration order. 

ES5 did not specify a an enumeration order because we discovered that there was not  a de facto for-in order that was used by all browser implementation.  The more edge cases that were examined, the more differences we found.

We did identify one situation where enumeration order will be the same across all major implementation that are currently in use (including IE6):

The enumeration order of an object's properties will be the order in which the properties were added if all the following conditions hold:
	The object has no inherited enumerable properties
	The object has no array indexed properties
	No properties have been deleted
	No property has had its attributes modified or been changed from a data property to an accessor property or visa versa

In practice this means that if you create an object like:
     var a = {};
     a.y=1;
     a.z=2;
     a.x=3;

you can depend upon the enumeration order being '"y", "z", "x".   If you do anything more complex including using integer property names you can not depend upon the order being the same across all browsers. 

Any code that does is buggy.

Allen


On Dec 27, 2010, at 3:45 AM, Dmitry A. Soshnikov wrote:

> On 27.12.2010 14:39, Michael Day wrote:
>> Hi,
>> 
>> Some quick testing with Firefox seems to show that for-in returns properties in the order they were added to the object, and some scripts on the web (eg. RaphaelJS) seem to depend on that, unless I'm horrendously misinterpreting them. This seems... bad?
>> 
> 
> Yes, it's bad. Because the spec really statements that the order of evaluation isn't specified. Moreover, some side-effects, e.g. `delete`ing of properties or adding new is also not specified directly, though there is a mention on it. IIRC, there was a case with JScript (IE) and these side-effects. Regarding non-specificity enumeration, there was/is a case with V8 (Chrome).
> 
> However, IMO, it's bad from the spec viewpoint (even if such a agreement is taken in price of optimization). I think (and sure many programmers will agree) that the consistent is more important. And the syntactic (lexical) appearing properties in the object should be enumerated in the same order. Adding/removing while enumeration also should be handled correctly.
> 
> 
>> Are objects implicitly ordered, by implementation convention?
>> 
> 
> In some implementations -- yes, in some -- not. So, it's not recommended to rely on it. Though, repeat, I'd change the spec instead.
> 
> Dmitry.
> _______________________________________________
> es-discuss mailing list
> es-discuss at mozilla.org
> https://mail.mozilla.org/listinfo/es-discuss

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20101227/2cdb82e2/attachment.html>


More information about the es-discuss mailing list