Property ordering of [[Enumerate]] / getOwnPropertyNames()

Jesse McCarthy es-discuss-2015-02 at jessemccarthy.net
Thu Aug 20 16:54:57 UTC 2015


I just want to confirm some things about property enumeration order of plain 
Objects. I apologize that this has probably already been discussed before, 
but it's hard to locate a clear answer. Please note that I'm solely asking 
about ES2015 spec compliance, not what's in the wild.

Given:

```js
var y = Object.create(null);
// Note that property names are all strings.
y.one = 1;
y.two = 2;
y.three = 3;
```

This is my understanding of what's guaranteed (or not) about enumeration 
order (in the context of the example given):

1. No guarantee of order
Anything that relies on or has property-order equivalence with 
`[[Enumerate]]` or `EnumerableOwnNames`
1b. for (x in y)
1c. Object.keys(y)

This is based on the statement in 9.1.11 [[Enumerate]] () step 1:
> The mechanics and order of enumerating the properties is not specified

Although it says that...
> [[Enumerate]] must obtain the own property keys of the target object as if 
> by calling its [[OwnPropertyKeys]] internal method.

...and `[[OwnPropertyKeys]]` specifies ordering, my reading is that 
`[[Enumerate]]` doesn't guarantee that the iterator it returns will preserve 
the order returned by `[[OwnPropertyKeys]]`.

2. Guarantee of insertion order (['one', 'two', 'three'])
Object.getOwnPropertyNames(y)

Are those interpretations correct?

Related:
In this thread...
https://esdiscuss.org/topic/nailing-object-property-order

...Bergi asked these pertinent questions that no one answered:
> But why was the default object [[enumerate]] algorithm not specced to 
> match the [[OwnPropertyKeys]] order then?
> ...
> Shouldn't we add a guarantee to [[enumerate]] that the subset of 
> enumerated own properties comes in insertion order as well?

This is partly in reference to http://stackoverflow.com/a/30244410/1034448



More information about the es-discuss mailing list