Get to know MDN better
このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。
プログラミング言語は、繰り返し実行するタスクを素早く終わらせるのがとても得意です。基本的な計算処理から、同じような作業がたくさんあるのならどんな状況でもこなします。今度は JavaScript でそういった目的を果たすために使用するループ構造を見てみましょう。
| HTMLおよびCSS の基礎を理解し、これまでのレッスンで説明した JavaScript を把握していること。 |
|
ループは、同じことを何度も何度も繰り返すものです。多くの場合、コードはループを一巡するたびに少しずつ異なり、また、同じコードを実行しても変数が異なることもあります。
例えば、<canvas> 要素に 100 個のランダムな円を描画したいとします([更新] ボタンを押すと、例を何度も実行して異なるランダムコレクションを見ることができます)。
こちらはこの例を実装している JavaScript コードです。
これですべてのコードを理解する必要はありませんが、実際に 100 個の円を描画している部分を見てみましょう。
基本的な考え方は理解できるでしょう。ループを使用してこのコードを 100 回反復処理し、それぞれがページ上のランダムな位置に円を描画します。コードの冒頭で定義した random(x) は、0 から x-1 の間の整数を返します。 100 個、1000 個、10,000 個の円を描画する場合でも、必要となるコードの量は同じです。 変更しなければならないのは、たった一つの数字だけです。
もしここでループを使用していなければ、描画したい円ごとに以下のコードを繰り返して書く必要があります。
これはとても退屈で、保守も大変でしょう。
ループを使用する場合のほとんどは、アイテムのコレクションがあって、すべてのアイテムに対して何かを行いたいときです。
Array は、コレクションの一種です。このコースの配列の章で紹介しました。 しかし、JavaScript には他にも Set や Map などのコレクションがあります。
コレクションをループ処理する基本的なツールは for...of ループです。
この例では、for (const cat of cats) は次のように言っています。
JavaScript には、コレクションに対してより特化したループもあるので、ここではそのうちの 2つを紹介します。
map() を使用すると、コレクション内の各アイテムに対して何かを行い、変更されたアイテムを格納した新しいコレクションを作成することができます。
ここでは、 cats.map() に関数を渡すと、map() は配列内のそれぞれのアイテムにその関数を 1 回ずつ、そのアイテムを渡して呼び出します。そして、それぞれの関数呼び出しの返値を新しい配列に追加し、最後に新しい配列を返します。この場合、提供した関数はアイテムを大文字に変換するので、結果として得られる配列には、すべてのネコ科動物が大文字で格納されます。
filter() を使用すると、コレクション内のそれぞれのアイテムをテストし、一致するアイテムのみを格納した新しいコレクションを作成することができます。
これは map() とよく似ていますが、渡す関数が論理値を返す点が異なります。 もし true を返すなら、アイテムは新しい配列に含まれます。 この関数では、アイテムが文字 "L" で始まるかどうかをテストするので、結果は名前が "L" で始まる猫だけを含む配列になります。
なお、map() と filter() は、どちらもよく関数式と一緒に使われます。これは関数モジュールで学びます。 関数式を使用すると、上の例をもっとコンパクトに書き直すことができます。
上の「円を描く」例では、ループさせるアイテムのコレクションがある訳ではありません。実際には、同じコードを 100 回実行したいだけです。 このような用途では、for ループを使用する必要があります。 これは以下のような構文があります。構文は以下の通りです。
ここでは、次のようになります。
for キーワードに続き括弧があります。
括弧の中には、セミコロンで区切られた以下の項目があります。
コードのブロックを格納する中括弧。このコードは、ループが反復処理されるたびに実行されます。
メモ: Aside: Loops - ScrimbaMDN 学習パートナー による、有用な for ループ構文の対話的な掘り下げです。
実際の例を見て、これらの機能をより明確にイメージできるようにしましょう。
これは次のような出力結果となります。
このコードは、1 から 9 までの数字の平方を計算し、その結果を書き出します。コードの中心は、計算を行う for ループです。
for (let i = 1; i < 10; i++) の行を 3 つの部分に分割してみましょう。
ループの内部では、現在の i の値の平方、すなわち i * i を計算します。計算した内容と結果を表す文字列を作成し、出力テキストに追加します。また、次に追加した文字列が改行されるように、\n も追加しています。すなわち、
for ループの代わりに、for...of ループを使用してコレクションを反復処理することができます。
上の for...of の例をもう一度見てみましょう。
このコードは次のように書き換えることができます。
このループでは、i を 0 で開始し、i が配列の長さに達した時点で停止しています。 そして、ループの中で i を使って、配列のそれぞれのアイテムに順番にアクセスしています。
JavaScript の初期のバージョンでは、for...of は存在しなかったので、これが配列を反復処理する標準的な方法でした。 しかし、この方法は、コードにバグを引き起こす可能性が高くなります。例えば、
このような理由から、通常は、できる限り for...of を使用するのがベストです。
時には、配列を繰り返し処理するために for ループを使用する必要があります。 例えば、以下のコードでは、猫の一覧をメッセージとして出力したい。
最終的に出力される文章はあまり整ったものではありません。
My cats are called Pete, Biggles, Jasmine,最後の猫については、このように別の処理をしてくれるのが望ましいと思います。
My cats are called Pete, Biggles, and Jasmine.しかし、これを行うには、ループがいつ最後の反復処理に入ったかを知る必要があります。そのためには、for ループを使い、i の値を調べればよいのです。
すべての反復処理が終了する前にループを終了したいときは、break 文を使用して終了させることができます。 前回の記事の switch 文で、入力した値が switch 文の case に一致したとき、switch 文を抜け、それ以降のコードを実行するために break 文を使用しました。
これはループでも同様で、break 文を使用することで即時にループを抜けて、ブラウザーに続きのコードを実行させることができます。
連絡先や電話番号の配列を検索して、見つけたい番号だけを返したいとします。 まずは HTML です。検索するテキスト入力用の <input> 要素と、検索内容を送信 (submit) する <button> 要素、検索結果を表示する <p> 要素を備えます。
そして JavaScript です。
コードの先頭で、いくつか変数を宣言しています。その中に、連絡先の情報を持った配列があり、各要素は名前と電話番号をコロンで区切った文字列となっています。
次に、ボタン (btn) にイベントリスナーを設定しています。ボタンが押されたときに検索結果が戻ってくるようになっています。
テキスト入力欄に入力された値を searchName という変数に格納してから、次の検索に備え、入力欄をクリアし、フォーカスを設定しています。 なお、検索に大文字小文字を区別しないよう、文字列に toLowerCase() を実行しています。
ここからが本題の for...of ループです。
ループの後、連絡先が設定されたかどうかをチェックし、設定されていない場合は段落テキストを「連絡先が見つかりません。」に設定しています。
メモ: すべてのソースは GitHub で見ることができます(動いているデモもあります)。
continue 文は break と同じような動作をします。けれど、ループを完全に抜けてしまうのではなく、次の繰り返しまで飛ばします。 それでは、今度は入力として数値を受け取り、その数以下で整数の平方である値のみを返すという例を見てみましょう。
HTML は基本的に前回の例と同じで、単純な数値入力と、出力用の段落があります。
JavaScript もほとんど同じですが、ループ自体が若干異なります。
出力結果はこちらです。
メモ: すべてのソースは GitHub でも見ることができます(動いているデモもあります)。
for は JavaScript で利用可能な唯一のループの種類ではありません。実際には多くのものがありますが、これらのすべてを理解する必要はありませんが、仕事の同じ機能をわずかに異なる方法で認識できるように、他のものの構造を見ておく価値があります。
まず、while ループを見てみましょう。このループの構文は次のようになります。
これは for ループととてもよく似た動作をしますが、初期化変数がループの前に設定される点と、最後の式が、これら 2 つの項目が括弧の中に入っているのではなく、実行するコードの後にループの中に含まれている点が異なります。 条件は括弧の中に入っており、その前には for ではなく while キーワードが置かれています。
同じ 3 つの項目が、for ループの中で定義されているのと同じ順番で存在しています。 これは、条件が真かどうかをチェックする前に、初期化処理を定義しておく必要があるためです。 そして、ループ内のコードが実行された(反復処理が完了した)後に最後の式が実行されますが、これは条件がまだ真である場合にのみ実行されます。
猫のリストの例をもう一度見てみましょう。ただし、while ループを使うように書き直してみましょう。
メモ: これは期待どおりに動作します。GitHub でライブ実行してみてください(完全なソースコードを見ることもできます)。
do...while ループはとてもよく似ていますが、while 構造の別な形です。
この場合、初期化処理は再び、ループが始まる前に来ています。キーワードは、実行するコードと最期の式を含む中括弧の直前にあります。
do...while ループと while ループの主な違いは、do...while ループの中のコードは常に少なくとも 1 回は実行される ということです。それは、ループ内のコードの後に条件が来るからです。つまり、常にそのコードを実行し、その後、もう一度実行する必要があるかどうかをチェックするのです。while ループや for ループでは、チェックが最初に来るので、そのコードは一度も実行されないかもしれません。
do...while ループを使用するように、猫のリストの例をもう一度書き直してみましょう。
メモ: こちらも、これは期待どおりに動作します。GitHub でライブ実行してみてください(完全なソースコードを見ることもできます)。
警告: どの種類のループでも、初期化子が増加するか、場合によっては減少するようにして、最終的に条件が偽になるようにしなければなりません。 そうしなければループは永遠に進み、ブラウザーはそれ強制的に停止させるか、クラッシュします。これは無限ループと呼ばれます。
この演習では、出力ボックスへの簡単な発射のカウントダウンを 10 から発射!まで表示してください。
この演習を完成するには、次のようにします。
メモ: あなたがループ(例えば while(i>=0))からタイピングを始めると、ブラウザーが固まってしまうかもしれません。終了条件をまだ入力していないからです。注意して下さい。この問題に対処するにはコメントの中にコードを書き始めて、完了してからコメントを削除することです。
間違えてしまった場合は、MDN Playground の Reset ボタンを使用して作業内容を消去できます。どうしても解決できない場合は、ライブ出力の下にある模範解答を確認してください。
最終的な JavaScript は次のようになります。
この演習では、配列に格納された名前のリストを、ゲストリストにしていただきます。しかし、フィルとローラは貪欲で無礼で、いつも料理を全部食べてしまうので、ゲストに入れたくありません!私たちは 2 つのリストを用意しました。1 つはゲストを認めるためのリスト、もう 1 つはゲストを拒否するためのリストです。
この演習を完成するには、次のようにします。
既に提供されているものは次のものです。
特別ボーナス問題 — 上のタスクを正常に完了すると、カンマで区切られた 2 つの名前リストが残されますが、それらは整頓されません。それぞれの末尾にカンマがあります。 それぞれの場合に最後のカンマを切り取り、末尾にピリオドを追加した行をどのように書くかという問題を解決出来ますか? ヘルプのため便利な文字列メソッドの記事を見てみてください。
間違えてしまった場合は、MDN Playground の Reset ボタンを使用して作業内容を消去できます。どうしても解決できない場合は、ライブ出力の下にある模範解答を確認してください。
最終的な JavaScript は次のようになります。
配列やそれを扱うオブジェクトを反復処理し、各項目の添字の位置にアクセスする必要がない場合は、for...ofが最良の選択となります。読みやすいし、間違うことも少ないからです。
その他の用途では、for、while、do...while のループはほとんど互換性があります。 これらはすべて同じ問題を解決するために使うことができ、どれを使うかは個人的な好み、つまり覚えやすいか直感的かによって大きく変わってきます。 少なくとも最初は for をお勧めします。初期化処理、条件、最後の式がすべて括弧の中にきちんと入るので、どこに何があるのかがわかりやすく、見落としがないかをチェックしやすいからです。
では、もう一度見てみましょう。
まずは for...of です。
for です。
while です。
そして最後は do...while です。
メモ: 高度な/特殊な状況やこの記事の範囲を超えて有用な、他のループタイプ/機能もあります。ループ学習をさらに進めたい場合は、高度なループと反復処理ガイドをお読みください。
この記事では、背後にある基本的な概念と、JavaScript でコードをループする際に使用できるさまざまなオプションについて説明しました。 ループが繰り返しの多いコードを処理するのに適したメカニズムであることを理解し、自分の例でループを使う気になったはずです。
次の記事では、この情報をどれだけ理解し、身についているかを確認するためのテストをいくつかご紹介します。
This page was last modified on 2026年5月23日 by MDN contributors.
Your blueprint for a better internet.
Visit Mozilla Corporation’s not-for-profit parent, the Mozilla Foundation.
Portions of this content are ©1998–2026 by individual mozilla.org contributors. Content available under a Creative Commons license.