Member Ordering

Brendan Eich brendan at mozilla.org
Thu Jun 5 13:39:41 PDT 2008


Using Lars's reply to respond to Mark's proposal, since it was not  
cross-posted. Mark's proposal text, one level of cite-quotation  
removed, first:

> -----Original Message-----
> From: Mark S. Miller [mailto:erights at google.com]
> Sent: 4. juni 2008 17:59
> To: Douglas Crockford
> Cc: Lars Hansen; es3.x-discuss at mozilla.org; brendan at mozilla.org
> Subject: Re: Member Ordering
>
> On Wed, Jun 4, 2008 at 8:42 AM, Douglas Crockford
> <douglas at crockford.com> wrote:
>> That is indeed discouraging. Perhaps ES3 did the right thing by
>> leaving the order unspecified.
>
> No. Please specify some deterministic order. I don't much care which.
> But leaving it unspecified complicates testing unnecessarily.
> Also, please see <http://www.cs.berkeley.edu/~amettler/purecomp.pdf>
> (draft paper) for further benefits that can only be realized
> after removing such unavoidable sources of hidden
> non-determinism. (Brendan, I've added you to the cc to make
> sure you see this paper. It makes another interesting bridge
> between information-flow and ocaps.)

(Thanks!)

I agree that we need to specify more than what ES1-3 specified.

The de-facto standard of insertion order remains mandatory, as far as  
I can tell, for most objects and named properties. You can't make a  
web-compatible browser without it.

But index-named properties, specifically in Array instances, could be  
treated differently -- maybe. We'll find out with very-large-scale  
Firefox 3 testing how often any web content cares that index order is  
not necessarily insertion order.


> A proposal:
>
> * For direct instances of Array: Use the Opera ordering for
> the own properties. Then the normal prototype-following
> insertion order for ascending the superclass chain. Note that
> Array.prototype is not an instance of Array, and so should
> enumerate by insertion order.


Array.prototype is an Array instance, but with a [[Prototype]]  
linking to Object.prototype instead of to Array.prototype (as all  
other Array instances have) -- see ECMA-262 Edition 3 15.4.4, first  
two paragraphs:

15.4.4 Properties of the Array Prototype Object

The value of the internal [[Prototype]] property of the Array  
prototype object is the Object prototype object (section 15.2.3.1).

The Array prototype object is itself an array; its [[Class]] is  
"Array", and it has a length property (whose initial value is +0) and  
the special internal [[Put]] method described in section 15.4.5.1.


On the other hand, Mark's proposal happens to match Firefox 3  
(SpiderMonkey JS1.8) because Array.prototype is not "dense" -- it has  
a bunch of named properties (to wit, the standard methods plus some  
extensions). But this is just a bug.

I like that the proposal does not generalize to indexed properties in  
any object. That seems better than obligating all implementations to  
segregate named from indexed properties in their property-map  
implementations. Array, Vector, other array-likes can opt in. ES4  
should specify which ones do.

/be
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.mozilla.org/pipermail/es-discuss/attachments/20080605/58ec81d9/attachment-0002.html 


More information about the Es4-discuss mailing list