Tim Jansen (2015-06-30T18:13:15.000Z)
d at domenic.me (2015-07-07T02:14:39.026Z)
I am working on a collections library that supports the Iterable/Iterator protocol, but I ran into a stumbling block: the iterator protocol seems to work differently for arrays and generator functions. Array iterators set 'done' to true *after* the last element, but function generators set 'done' to true *on* the last element. Is this incompatibility intentional, or or just an implementation issue in the browsers (tested on FF38 and Chrome 43)? I wasn't able to find any information on this. The ES6 draft from April '15 doesn't define when exactly 'done' is set. Code example: ```js var a = ['a', 'b']; var itA = a[Symbol.iterator]; itA.next(); // {value: 'a', done: false} itA.next(); // {value: 'b', done: false} !! itA.next(); // {value: undefined, done: true} function* b() { yield 'a'; return 'b'; } var itB = a[Symbol.iterator]; itB.next(); // {value: 'a', done: false} itB.next(); // {value: 'b', done: true} !!! itB.next(); // {value: undefined, done: true} ``` The difference is in the second invocation of next(), which returns true for generator functions. That protocol makes it impossible for me to support both generator functions and array iterators with the same implementation - at least if I want to support 'undefined' as a valid value in collections. I wouldn't be able to differentiate between an empty list ([]) and a list containing undefined ([undefined]).