今後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.childNodes
も iterable
。
iterable === Array
ではありませんから、Array#forEach
とかは使えなくて、Array.from
でArray
に変換しなくてはなりません。
そういう意味では、言語の構文として for..of
があるので、便利になったと言えるでしょう。
ちなみにString
もiterable
だそうで、実は本日知りました(内緒)。
一般的な使い方
一般的には以下のように使います。これは配列の場合ですね。他も似たり寄ったりです(多分)。
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
を使いましょうと。
インデックスが必要ない場合だけですけどね。