On Jul 30, 2010, at 3:49 PM, Oliver Hunt wrote:

>>> By overloading for(in) we are effectively saying that there will never be a 
>>> simple way to iterate arrays by value directly, because no one can even 
>>> extend the builtin array type be have a generator for iteration because 
>>> doing so would be too fragile.
>> 
>> This "never be a simple way" is not true in JS1.7+:
>> 
>> js> Array.prototype.__iterator__ = function () { for (let i = 0; i < 
>> this.length; i++) yield this[i]; };
>> (function () {for (let i = 0; i < this.length; i++) {yield this[i];}})
>> js> for (v in [3,4,5]) print(v)
>> 3
>> 4
>> 5
>> 
>> The unstratified, ugly-named __iterator__ meta-method is the getter or 
>> factory for finding or creating an appropriate iterator. I use a generator, 
>> since it is the simplest way of writing such a factory.
> 
> I recognised that was possible -- the problem i was saying is that you can't 
> do that due to it polluting the global array prototype in away that effects 
> language semantics

Yeah, and it was hardly a "simple way" as I wrote it, but these little 
headaches are fixable:

js> Object.defineProperty(Array.prototype, '__iterator__', {value: function () 
{ for (let i = 0; i < this.length; i++) yield this[i]; }});
[]
js> for (v in [3,4,5])print(v)
3
4
5

And put the Object.defineProperty call into some init-time code in JQuery ;-).

/be
_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to