The iterator protocol
Any object with a next() method that returns { value, done } is an iterator. for...of and spread (...) work on anything that implements this protocol.
// Manual iterator
function makeRange(start, end) {
let current = start
return {
next() {
if (current <= end) {
return { value: current++, done: false }
}
return { value: undefined, done: true }
}
}
}
const iter = makeRange(1, 3)
console.log(iter.next()) // { value: 1, done: false }
console.log(iter.next()) // { value: 2, done: false }
console.log(iter.next()) // { value: 3, done: false }
console.log(iter.next()) // { value: undefined, done: true }