One thing I dislike about the iterator protocol is that it creates garbage around every value you're iterating over:
let set = new Set([1,2,3]), it = set.values(), n;
while(!(n = it.next()).done) console.log(n);
// {value: 1, done: false}
// {value: 2, done: false}
// {value: 3, done: false}
I found this strange considering javascript has symbols now. Symbols would be perfect for the iterator protocol:
while((n = it.next()) !== Symbol.iteratorDone) console.log(n)
// 1
// 2
// 3
Not that this is too much of an issue, I'm sure using yield/yield*/of will eventually optimize this.