Clarifications on the iterator protocol

David Bruant bruant.d at gmail.com
Sat Jan 11 11:21:06 PST 2014


Hi,

I'm starting a documentation on the iterator protocol and wanted to ask 
a few things just to be 100% sure, because some things may leave room to 
ambiguities.

## Just for confirmation

First, on the relevant TC39 meeting notes [1]. It is suggested that 
"Without Brendan, a champion of iterators and generators, don't have 
full consensus". Later notes don't come back to this, so I imagine 
Brendan agrees (upon confirmation, I'll PR the meeting notes to reflect 
this for future readers).


## Iterator protocol next signature.

The meeting notes suggest the following signature for next:
next: () -> {done: boolean, value?: any}
(it's not clear if it's the iterator protocol or generator.next signature)

However, in the current draft, the IteratorNext operation takes a value 
argument as passed it to the call to .next.
Also, although ES6 will not make use of that, it's possible for 
user-generated iterators to accept any number of arguments.
Also, the IteratorComplete seems to survive if there is no "done" 
property returned (interpreted as done: false obviously).
In the end, it looks like the broader signature of user-created 
iterators is something like:
next: (value?: any, ...extraArgs) -> {done?: boolean, value?:any}

The language will never make use of the extra arguments, but 
user-defined sub-protocols might. The generator protocol does use the 
first argument if the generator body does.


 > Always has an own property called "value"

To answer my above question, it looks like the .next signature agreed 
upon is neither the iterator protocol (which seems effectively broader), 
not the generator one, which as quoted always have an own value property.

David

[1] 
https://github.com/rwaldron/tc39-notes/blob/master/es6/2013-03/mar-12.md#conclusionresolution-1


More information about the es-discuss mailing list