◆ split とか replace で n 文字まとめて関数を実行できるようなの考えてみました
◆ for キライじゃなければ for でいいかも 

文字列を N 文字ずつ処理したいときってたまにありますよね
デフォルトの JavaScript では N 文字ずつで配列分割してくれる機能がないですし for とか while でやるのは嫌です
ということでいくつか考えてみました

N は 3 としたコードになってます

split 使う

案1

// reverse メソッドが必要
var str = "abcdefg"
str.reverse().split(/.{0}(?=(?:.{3})+$)/)
.map("".reverse.call.bind("".reverse)).reverse()
.forEach(function(three_str){
// ここでなにかする
})
先読み?を使います
普通にマッチした上で さらに後ろに指定された文字列が来た場合にだけマッチしたことにするやつです
マッチした文字列には 後ろの指定された文字列は含まないです

先に指定文字があってマッチさせたい文字列を後ろに置くほうが必要だったのですが JavaScript では非対応らしかったので reverse してどうにかしてます
reverse メソッドはあってもよさそうなのにないので定義しておく必要ありです
String.prototype.reverse = function(){
return [...this].reverse().join("")
}
ES6 ならこれでいいです
ES6 に reverse メソッドなんでないんだろ

最初に 1 文字から 3 文字マッチして残りは全部 3 文字になります
reverse したのが "gfedcba" なら ["g", "fed", "cba"] となります

それぞれの要素も reverse してるので map でそれぞれ reverse します
そして 配列全体も reverse すると 3 つずつ文字列が入った配列ができています

最後はこれに forEach で好きなことをします

複雑です
後読みができないせいで!!!

案2

var str = '1234567890123'
str.split(/(.{3})/).filter(function(e){
return e
}).forEach(function(three_str){
// ここでなにかする
})
さっきと比べていっきにシンプルになりました

split の引数に正規表現があると その値を基準に分割するのでマッチした値は消えてしまいます
しかし () でキャプチャしておけば その値が分割する間に入ります

それを利用して 3 文字ずつ配列化します
ただし これだと分割したときにできる空文字列が合間に入ってしまいます
これはいらないので filter 使って消せば 3 文字ずつ配列のできあがり!

あとはさっきと同じく forEach でそれぞれになにかすればいいです

replace 使う

次は split じゃなくて replace でやってみます
var str = "samplestr"
str.replace(/(.{1,3})$|.{3}/g, function(three_str, isLast){
if(isLast){
// ここでなにかする(最後)
}else{
// ここでなにかする(最後以外)
}
})

配列が必要なんじゃなくて 3 文字単位で関数を実行するだけなら replace が楽です
ただ .{1,3} でも最長一致でマッチするので大丈夫ですが (.{1,3})$|.{3} にすれば () のキャプチャがあるかないかを見て最後かどうかを判断できます

split の方だと 配列なので forEach の第二引数と第三引数を見れば今が最後の要素かは把握できるので replace の場合でも最後にだけ何かしたいのに対応できるようにしました

まとめ

split (案1) は後読み出来なかったのを無理矢理やってみたので実際やらないほうがいいですが あと 2 つは悪くはないかなー と思ってます
3 のところを可変にすると リテラル使えなくなって RegExp で生成しないといけないのがちょっとめんどうですけど

while や for 使いたくなくて 短くできるだけ 1 つの式で書きたかったので正規表現多様してますが 正規表現自体が早いとは言えないので 速度重視なら while や for 書いたほうが良いです
基本速度は C に近い書き方ほど早くて 便利な書き方になるほど遅くなります
速度だけみれば forEach よりも for です

for で書くとこんな感じかな
for(var str = "qwertyui";str;str = str.substr(3)){
fn(str.substr(0,3), str.length<=3)
}

function fn(three_str, isLast){
// ここになにかかく
}

for で書いても短かかったです