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 _______________________________________________ Es4-discuss mailing list [email protected] https://mail.mozilla.org/listinfo/es4-discuss
