銀の弾丸

プログラミングに関して、いろいろ書き残していければと思っております。

今後JavaScriptでArray.forEachはほとんど使わなくなるのかも


いままでJavaScriptの繰り返しは Array#forEachを使いまくっていましたけど、2018年現在「インデックスが必要ないなら for..of 構文が使えますよ」と聞きまして、ミーハーなので突然使い始めています。

聞いたことはありました

いや、for..of については小耳にはさんだことはありましたが「(どうせ)各ブラウザではまだ対応状況がまちまちだったりするんでしょ?」とか思い込んでいて、とりあえず静観してたら忘れちゃっていました(「どうせ」は良くない接頭語w)。

Edge以外はほとんど対応しているみたい

今調べてみると、思った以上に各ブラウザが対応していて、これは無視できないムーヴメントだと認識するに至りました。

MDNによるとEdgeが未対応らしいですね。だから、あまねく世に繰り出すWebサービスでは使えないのかもしれないけれど、個人的にはEdgeはほとんど使わないので、今後for..ofをガンガン使って行こうという所存です。

for ... of の構文は?

MDNでは、以下のように説明されています。

for (variable of iterable) {
  statement
}
variable
それぞれの反復処理において、別々のプロパティの値が variable に代入されます。
iterable
列挙可能なプロパティに対して、反復処理を行うオブジェクトです。

iterableは簡単に言えば配列みたいなオブジェクトで、関数の引数リストである arguments や、DOMの Node.childNodesiterableiterable === Arrayではありませんから、Array#forEachとかは使えなくて、Array.fromArrayに変換しなくてはなりません。 そういう意味では、言語の構文として for..ofがあるので、便利になったと言えるでしょう。 ちなみにStringiterableだそうで、実は本日知りました(内緒)。

一般的な使い方

一般的には以下のように使います。これは配列の場合ですね。他も似たり寄ったりです(多分)。

for(const foo of [0,1,2]) {
    console.log(foo);
}
// output:
// 0
// 1
// 2

速度に関する考察

入力情報によれば「Array.forEachよりも関数呼び出しが伴わない分、for..of のほうが若干速い」とのことでした。

Array.forEachで各ループを別スレッドに振り分けるような実装がされたら、処理速度は比較にならないのでは?と思っていましたが、for..of だって別スレッドに割り振れるはずなので、どっこいどっこいなのかな?と。

ほとんどforEachは使わなくて済みそうですね

見た目に for..ofのほうがスッキリするし若干速そうなので、今後はfor..inを使いましょうと。 インデックスが必要ない場合だけですけどね。