The Simplest Iterable

A string is the simplest iterable to experiment with: call its [Symbol.iterator]() method and step through it with next(), as for...of does behind the scenes. The iterator walks by code point, so an emoji stored as two UTF-16 code units comes out whole. Built-in iterators return themselves from [Symbol.iterator](), which is why for...of accepts map.entries() directly.

Driving a string iterator by handJavaScriptLive
const str = 'hi😀';
const it = str[Symbol.iterator]();
console.log(it.next(), it.next());
console.log(it.next(), it.next());                 // exhausted: done is true
console.log(it[Symbol.iterator]() === it, str.length, [...str].length);

An iterator is single-use: once done is true it stays exhausted, so request a new one for a second pass.