I was setting something there to test out, and just forgot about removing it. You can replace it with the offset and it will work the same.
Sounds like you got it. The params with forEach are in the opposite order of jQuery's each, so index is the 2nd param. And 0 will evaluate as false, so there won't be a pause at the start.
To be honest, it wasn't obvious at first where the spaces were even coming from. I couldn't see any spaces when I inspected the elements in my dev tools, so I made a version using canvas just to compare.
Then it hit me. I was using " " in my canvas to detect white spaces, so I logged this out.
console.log(quote.children[0].childNodes);
// [div, text, div, text, div, text, div, text, div, text, div, text, div, text, div, text]
Bam! Like I said, whitespaces are usually found in between words. Those whitespaces are text nodes, which won't show up as an element in your dev tools.
So to add a delay in between words, we need to start the loop with words instead of chars, and follow this pattern - word > chars from word > whitespace delay > word > chars from word > whitespace delay > word > chars from word > etc.
And yes, I would have to agree that there should be an option to have the whitespace wrapped in a div. I can definitely see how it could be useful.