Member Ordering

Brendan Eich brendan at mozilla.org
Tue Jun 3 11:56:33 PDT 2008


On Jun 3, 2008, at 9:25 AM, Douglas Crockford wrote:

> ES3 says that objects are unordered with respect to the sequence  
> produced by
> for...in. Nevertheless, many web developers have an expectation  
> that the
> sequence should reproduce the insertion order. That implied order  
> is strictly
> complied with in all browsers except Opera which can optimize  
> numeric sequences.
>
> We like the Opera optimization. Web developers don't seem to notice  
> that it
> diverges from common practice, except that for in on arrays seems  
> to work
> correctly in cases that seem to be confused on other browsers.

Confused in other browsers *only* if one creates the array's indexed  
properties in other than index order. That's rare, so it's not a huge  
hardship and I hope we can do what you propose, even though it's an  
incompatible change from past releases of most browsers. From a  
Firefox 2's JavaScript 1.7, in the SpiderMonkey shell:

js> a = []

js> a[3]=3
3
js> a[2]=2
2
js> a[1]=1
1
js> a[0]=0
0
js> for(i in a)print(i)
3
2
1
0


> We are also reluctant to slap Opera for having produced the best  
> implementation
> of this feature in a way that fully complies with the current  
> standard.

You would not be slapping only Opera. Firefox 3's JavaScript 1.8  
matches it:

js> a = []
[]
js> a[3]=3
3
js> a[2]=2
2
js> a[1]=1
1
js> a[0]=0
0
js> for(i in a) print(i)
0
1
2
3

but only for dense arrays: length <= 32 or load factor >= .25 -- and  
no ad-hoc named, direct properties. I hear Opera has similar  
restrictions, but I haven't tested.

There are other hard cases:

js> a = []

js> a[3]=3
3
js> a[2]=2
2
js> Array.prototype[1] = 1
1
js> Object.prototype[0] = 0
0
js> for (i in a) print(i)
2
3
1
0


> We want to better specify the ordering of for...in because the  
> developer
> community has expectations. We are reluctant to impose a particular
> implementation of objects, but we do like that Opera's optimization  
> seems to
> best match expectations in a way that is the least surprising, and  
> possibly the
> best performing.
>
> How would the other three feel about having to adopt Opera's  
> convention?

We need an exact spec of what Opera does to agree, or better: we need  
a spec that matches Opera and Firefox 3 for the easy case of dense  
arrays with no prototype indexed properties and no ad-hoc named  
properties.

I'm in favor of for-in using index order for arrays, provided we can  
get the hard cases "right" for some reasonable definition of "right".  
We'd adapt future Mozilla releases to match.

/be


More information about the Es4-discuss mailing list