Allen Wirfs-Brock wrote:
Currently the spec. days that if it is not an Iterable the for-of loop
doesn't run (although some of the details in the For In/Of Expression
Evaluation looks a little bogus). It would be easy enough to to spec.
it such that if the value is not an Iterable (does not have an
@@iterator property) then it just assumes that it must already be an
Iterator.
Of we could do what has been proposed since ES4 days, and (after Python)
make @@iterator for an iterator return that self-same iterator:
js> a = [1,2,3]
[1, 2, 3]
js> a.iterator
function iterator() {
[native code]
}
js> it = a.iterator()
({})
js> it.iterator
function iterator() {
[native code]
}
js> it.iterator() === it
true
(SpiderMonkey latest, no unique iteratorSymbol yet.)
Just assuming an iterator if there is no @@iterator means trying .next()
with exception suppression when there is no 'next' or its value is not a
function, right? That seems worse than the Python way. We don't want the
case where there *is* an @@iterator to suppress missing/non-callable 'next'.
in that case we could say:
function combine(bowls) {
let iterator = bowls[iteratorSymbol]();
let {value: firstBowl, done} = iterator.next();
if (done)
return; // no bowls at all
for (let bowl of iterator)
dumpInto(bowl, firstBowl);
}
This is as good as it gets, btw -- Jason's Python didn't handle the "no
bowls at all" case.
Do you want a bugs.ecmascript.org ticket on this?
/be
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss