やんまーのはてなブログ

Webアプリケーションを開発したい人

Javascriptにおける、forとforEachの比較

知人に質問された内容への回答を兼ねて、Javascriptにおける繰り返し文の記法を振り返る。

この記事では、同じ結果を出力する繰り返し文を、次の2つの文法で記述し比較する。 - for文 - forEach()メソッド

他の記法には言及しない。

配列の要素を出力する

for文と同様に、forEach()メソッドも繰り返し処理をすることができる。

しかし記述方法は異なり、forEach()は配列のメソッドである。 引数にはコールバック関数(今回はitemを引数とするアロー関数)を渡す。

渡されたコールバック関数を配列の各要素に対し実行することで、繰り返し処理が実現できる。

// for文で要素を羅列
const items = [ "hello", 32, true ];

for( let i=0; i< items.length; i++ ){
  console.log( items[i] );
}
// forEach()メソッドで要素を羅列
const items = [ "hello", 32, true ];

items.forEach( item => {
  console.log(item);
});

上記2つの実行結果は一致し、以下を出力する。

hello
32
true

配列の添字と配列の要素を出力する

forEach()メソッドにわたすコールバック関数で、配列の要素だけでなく添字も受け取る方法を示す。

const items = [ "hello", 32, true ];

for( let i=0; i<items.length; i++ ){
  console.log(`${i} : ${items[i]}`);
}
const items = [ "hello", 32, true ];

items.forEach( (item, index) => {
  console.log(`${index} : ${item}`);
})

上記2つの実行結果は一致し、以下を出力する。

0 : hello
1 : 32
2 : true

上記のように、forEach()メソッドに渡すコールバック関数の、第一引数は配列の要素、第二引数は配列の添字を受け取るようになっている。

補足: console.log内で定義している文字列はテンプレートリテラルを利用し、変数の値を埋め込んだ文字列をつくっている。

まとめ

for文もforEach()メソッドも繰り返し処理を表記できるが、forEach()メソッドのほうが簡潔に表記できるので、ES6が認められる環境であれば、forEach()メソッドを使うのが好ましい。

ちなみに、forEach()メソッドだけでなく、filter()メソッドやfind()メソッド、map()メソッド等が使える場合は、こちらのほうが更に簡潔に書けるため好ましい。

その他、for...in文やfor...of文もあるが、ここでは言及しない。

参照

ソースコードをおいてあるgistリポジトリ: https://gist.github.com/basd4g/546dd9e378f93f6c24b8c8abab6fe187