On Oct 2, 2012, at 3:55 PM, Brendan Eich wrote: > Domenic Denicola wrote: >> From: Rick Waldron [mailto:[email protected]] >> >>>> This seems like an unfortunate decision, and I couldn't discern the >>>> motivation in the minutes. When would I want to use a syntax that fails >>>> for iterables? Does [...x] throw for an iterable, or result in something >>>> else? >> >>> The direct reasoning for the resolution was: >> >>> "Cannot be both iterable and array-like" >> >> I can't really understand what this is trying to say. It must be because I >> don't understand "iterable". Doesn't it just mean "responds to for-of"? > > It means (in ES6, SpiderMonkey uses a string property name 'iterator') that > the object in question ("is obj iterable?) has an @iterator property, which > when called gets or creates an iterator for obj. > >> I would imagine arrays, NodeLists, arguments, and other array-likes all >> respond to for-of; if they don't, that seriously decreases the utility of >> for-of! > > Array.from is that an object is either iterable, or failing that, array-like > (even if no .length property, ToUint32(undefined) => 0 so no elements). See > bottom of https://mail.mozilla.org/pipermail/es-discuss/2012-July/024207.html.
But also see https://bugs.ecmascript.org/show_bug.cgi?id=588 and in particular comment 1 which says: Did we talk about the implications of of using iterable protocol if the array has holes? The proposed standard iterator for Arrays turns holes into undefined. While normal array-like iteration skips holes. I would expect that let a2 = Array.from([,,,,5]); would produce a new array that was just like the argument array. But using iterator protocol would make it just like: let a3 = Array.from([undefined, undefined, undefined, undefined, 5]); It seems to me that the right solution, is that if the from argument is a real Array then Array-like, hole preservation, iteration should be used. If it isn't a real Array, then from should first try iterable protocol and if it isn't there fall back to array-like. > > As Allen's followup points out, array iteration skips holes, to match > Array.prototype.forEach. Should spread fill holes or skip them? Holes need to be skipped if we expect var arrayWithHoles = [,,2,,,5]; var copyOfArrayWithHoles = [...arrayWithHoles]]; to make an accurate copy. > >>> It's possible that this could be added to the agenda for november, if >>> Brendan wants to discuss SpiderMonkey's experience implementing it. It >>> seems to me that if they're not having issues then it's at least worth a >>> mention. >> >> Yay! > > I actually do not remember why we went back to only array-like instead of > iterable || array-like for spread. Can someone (Rick? Dave? Arv?) recall? > > /be > _______________________________________________ > es-discuss mailing list > [email protected] > https://mail.mozilla.org/listinfo/es-discuss >
_______________________________________________ es-discuss mailing list [email protected] https://mail.mozilla.org/listinfo/es-discuss

