[whatwg] Adding ECMAScript 5 array extras to HTMLCollection

Oliver Hunt oliver at apple.com
Thu Jul 29 21:43:51 PDT 2010


On Jul 29, 2010, at 9:03 PM, Alex Russell wrote:

> On Mon, Apr 26, 2010 at 10:04 AM, David Flanagan
> <david at davidflanagan.com> wrote:
>> Erik Arvidsson wrote:
>>>>> 
>>>>> for (var i = 0, length = collection.length; i < length; i++)
>>>>> // instead of:
>>>>> for (var i = 0; i < collection.length; i++)
>>>>> 
>>>> Actually, the former is a problem when the nodelist is modified in the
>>>> loop; it may result in collection[i] being undefined.
>>> 
>>> Even when checking the length in every iteration you can run into
>>> problems. If you remove something earlier in the collection you will
>>> *miss* one item unless you fix the loop iterator.
>>> 
>>> We should not let these edge cases get in the way of making the DOM
>>> collections feel less foreign to JavaScript.
>>> 
>>> --
>>> erik
>>> 
>> 
>> Rather that trying to make DOM collections feel like arrays, how about just
>> giving them a toArray() method?
> 
> This is pretty terrible. For lack of a way to subtype Arrays in the
> language, we're going to contort the entire DOM API (again) to do
> unnatural things? The right answer here is to make an immutable length
> Array type/trait/interface and just define the various flavors of HTML
> collection in those terms.

The various html collections aren't fixed length, they're not assignable, so they can't used interchangeably with arrays at the best of times.

> Support for doing this needs to be one of TC39's highest priority
> tasks, and indeed the work on proxies is going to make it possible in
> Harmony. No need to screw up the DOM any more than it already has
> been.

I'm not sure how you expect proxies to help here but for the record all array functions defined in ES5 are "generic" in that they work over any array-like object.  So Array.prototype.forEach.apply(myHTMLCollection, function(...){...}) will work.  This is obviously not as elegant as might be liked and TC39 is (or at least was) considering putting generic methods onto the Array constructor, eg. Array.forEach(arrayLike, callback)

--Oliver



More information about the whatwg mailing list