You’re grabbing the iterator early with const iter = range(1, 4)[Symbol. iterator](); , but that returned object doesn’t have its own [Symbol. iterator]() (so it’s not iterable), so how are you expecting [. . . iter] to work without either spreading range(1, 4) directly or adding [Symbol. iterator](){ return this } onto the iterator? I might be wrong here.
iter is only an iterator here, not an iterable, so [...iter] blows up unless you either spread range(1, 4) directly or give the iterator its own [Symbol.iterator]() { return this; }.
That’s the whole bug. next() alone isn’t enough for spread.