「JavaScript」のfor文は、同じ処理を決めた回数分繰り返す際に使用します。本記事では、「JavaScript」のfor文の使い方や注意点について解説します。
目次
「JavaScript」のfor文は、リストの生成や一覧の取得など、複数回同じ処理を繰り返したいときに使用します。
for文を使うことによって、同じ処理のコードを数行以上記述する必要がなくなり、視覚的にも分かりやすく可読性の高いプログラムを記述できます。
似た構文としてwhile文もありますが、回数ではなく条件で処理を繰り返す際に使用します。
「JavaScript」のfor文の基本的な書き方は、以下の通りです。
ここからは、これらの方法について解説します。
for文の基本的な書式は、以下の通りです。
for(初期化式;条件式;加算式){ 繰り返したい処理 }
実際にコードを書いてみると、以下のようになります。
for(let i = 0; i < 10; i++){ console.log('Hello!'); }
この処理は、「変数iの初期値を0として、変数iの値が10未満の間、iを1増やしながら繰り返す」という意味です。上記のコードを実行すると、「Hello!」と10回出力されます。
for文を使用して、配列内の要素を順番に取得できます。
const fruits = ['apple','grape','orange','melon','pineapple']; for(let i = 0;i < fruits.length;i++){ console.log(fruits[i]); }
上記のコードを実行することで、「apple,grape,orange…」と、配列に格納されている順番で配列の内容がすべて出力されます。
fruits.lengthのlengthは、配列内にある要素の数を取得する「JavaScript」のプロパティです。上記の例ですと、fruits.lengthは5と同じ意味になり、配列の要素数である5回分処理が繰り返される仕組みです。
ループ処理を途中で停止して処理を抜けるには、break文を使用します。
以下は、break文の使用例です。
const fruits = ['apple','grape','orange','melon','pineapple']; for(let i = 0;i < fruits.length;i++){ if(fruits[i] === 'orange'){ break; } console.log(fruits[i]); }
上記コードを見るとif文の中にbreakが記載されおり、繰り返し処理でorangeが出力されたら処理を停止してfor文の次処理をおこないます。ここでは「apple」と「grape」だけが出力され、あとの要素は出力されません。
繰り返し処理の中で特定の処理だけ実行させたくない場合は、continue文を使用します。
以下は、continue文の使用例です。
for(let i = 1;i <= 10;){ if(i % 2 !== 0){ continue; } console.log(i); }
continue文を使用すると、繰り返し処理内の他の処理をスキップし、次の繰り返し処理に進みます。上記のコードを実行すると、if文にて変数iが奇数であると判断された時点で処理がスキップされ、「2,4,6…」といった偶数のみ出力されます。
「JavaScript」のfor文には、以下のような応用した書き方があります。
ここからは、for文の応用について解説していきます。
「JavaScript」のfor文では、カンマ演算子を使用することで複数の変数・変化式を扱えます。
カンマ演算子を使う基本的な構文は、以下の通りです。
for(初期化式1,初期化式2; 条件式; 変化式1,変化式2){ 繰り返したい処理 }
初期化式と変化式を2つ定義し、カンマ区切りで指定することによって、扱う変数・変化式を複数にできます。
注意点として、初期化式は異なる変数を定義します。
以下は、具体的な使用例です。
for(let i = 0,j = 5;i < 5;i++,j--){ console.log(`i:${i} j:${j}`); }
上記コードを実行すると、i:0 j:5、i:1 j:4、…、i:4 j:1のように、iは1ずつ加算された値、jは1ずつ減算された値が出力されます。
「JavaScript」のfor文で使用するカウンタは、+を使用して増やすだけでなく-を使用して減らすこともできます。
for(let i = 10; i > 0; i--){ console.log(i); }
i++は「i = i + 1」と同じ処理で、++のことは「インクリメント演算子」と呼ばれます。同様にi–は–は「デクリメント演算子」と呼ばれ、「i = i – 1」の処理と同じ、上記は、10,9,8,7…というように値が1ずつ減算されながら出力されます。
「JavaScript」のfor文でカウンタをひとつ飛ばしで更新する方法には、continueを使うよりも、以下のようなシンプルな方法が適切です。
for(let i = 0; i < 10; i = i + 2){ console.log(i); }
このように、加算式を「i = i + 2」とすることでループ度にカウンタの値を2ずつプラスすることができます。
上記のコードを実行すると、0,2,4…というように値がひとつ飛ばしで出力されます。
「JavaScript」のfor文は、for文の中にfor文を入れることで入れ子構造を作れます。その中でbreak文を使うと、現在のループから1つ外側のループに移動します。
for(let i = 0; i < 10; i ++){ console.log(`i:${i}`); for(let j = 0; j < 10; j++){ if(j === 3){ break; } console.log(`j:${j}`); } }
上記コードを実行すると、内側のループ(j)が3のときに次の外側のループ(i)に移動が可能です。break文は実行された時点で残りの処理もスキップするため、i:0,j:0,j:1,j:2,i:1,j:0,j:1…というような出力結果になります。
ただしfor分のループ処理を3重・4重…と使用するのは、コードの可読性および保守性を悪くします。コードを書くときはfor文の入れ子構造は最小に抑えるか、使用しない方法を模索することを心がけましょう。
for文の2重ループの中でcontinueを使用すると、breakのときと違った動きをします。
for(let i = 0; i < 10; i ++){ console.log(`i:${i}`); for(let j = 0; j < 10; j++){ if(j === 3){ continue; } console.log(`j:${j}`); } }
上記コードを実行すると、内側のループ(j)は「j:1,j:2,j:4,j:5…」というように、jが3のときだけ処理をスキップし、その後外側のループ(i)に戻ります。
breakでは4以降の内側ループ(j)を完全にスキップするのに対し、continueでは4以降も出力され、内側(j)1回分のループのみをスキップするということがわかるでしょう。
オブジェクトの中身を取り出す際に使われる方法として、「for…in文」があり{キー : 値}の形で定義されます。for…in文では、オブジェクトから取得したプロパティを順番に変数に代入し、プロパティの数だけ処理を繰り返します。
詳細な例は以下の通りで、const appleがオブジェクトです。
const apple = { price:100, color:'red', shape:'round' } for(let key in apple){ console.log(`プロパティ:${key}`); console.log(`値:${apple[key]}`); }
上記コードを実行すると、「プロパティ:price」「値:100」をプロパティの数だけ実行します。また、「オブジェクト名[変数名]」と指定することで、値の出力も可能で、以下のように出力されます。
プロパティ:price 値:100 プロパティ:coler 値:red プロパティ:shape 値:round
for…in文は、「JavaScript」の多くのガイドラインで非推奨とされています。
class Fruits{ constructor(price,color,shape){ this.price = price; this.color = color; this.shape = shape; } } Fruits.prototype.helloWorld = function(){ console.log('Hello World!'); } const apple = new Fruits(100,'red','round'); for(let key in apple){ console.log(`プロパティ:${key}`); console.log(`値:${apple[key]}`); }
上記コードのように、prototypeでクラスにメソッドを追加しfor…in文を実行すると、以下のように追加されたhelloWorldメソッドも合わせて取得してします。その結果、意図しない不具合の発生に繋がってしまうでしょう。
プロパティ:helloWorld 値:function() { console.log('Hello World!'); }
これを回避するには、for文内にhasOwnPropertyメソッドを以下のように使用します。
for(let key in apple){ if(apple.hasOwnProperty(key)){ console.log(`プロパティ:${key}`); console.log(`値:${apple[key]}`); } }
hasOwnPropertyメソッドは、オブジェクトが指定したプロパティを持っていればtrueを、持っていなければfalseを返すメソッドです。そのため上記コードのように条件分岐を加えて実行すると、helloWorldメソッドはプロパティとなる$keyを持たないため、配列としての取得を回避できます。
for…of文の使い方は、for…in文とよく似ています。
const fruits = ['apple','grape','orange','melon','pineapple']; for(let fruit of fruits){ console.log(fruit); }
上記コードを実行することで、配列fruitsの値が1つずつ取得され、順番にconsole.logで出力が可能です。
for…of文はイテラブル・オブジェクトのみ扱え、for…in文のようにオブジェクトを扱おうとするとエラーになります。イテラブルとは反復可能という意味で、文字や数値の列など1つずつ繰り返しの処理で取得できる要素を指します。そのため、{ キー: 値 }で表現されるオブジェクトとは異なります。
const apples = { price:100, color:'red', shape:'round' } for(let apple of apples){ console.log(apple); }
for…of文で上記コードを使うことは基本的にはできません。イテラブル・オブジェクトを自身で作成する必要があります。
配列の中身を取り出すためのメソッドとして、forEachメソッドがあります。
const fruits = ['apple','grape','orange','melon','pineapple']; fruits.forEach((fruit)=>{ console.log(fruit); });
上記のコードを実行すると、配列fruitsの値が1つずつ順番に出力されます。
またforEachメソッドは、第2引数でインデックス番号、第3引数で処理している配列を取得可能です。
const fruits = ['apple','grape','orange']; fruits.forEach((value, index, array)=>{ console.log(value); console.log(index); console.log(array); });
上記コードを実行することで、「apple」「0」「(3)[‘apple’,’grape’,’orange’]」…という形式で、インデックス番号と配列の情報を順番に出力できます。
forEachメソッド内でbreakを使用するとエラーがでるので、注意が必要です。
もしbreakで処理を抜けたい場合は、forEachメソッドと似た機能を持つsomeメソッドを使います。
const fruits = ['apple','grape','orange','melon','pineapple']; fruits.some(value => { if (value === 'orange') { return true; } console.log(value); });
上記のコードを実行すると、valueがorangeだと判定された時点で処理が中断されます。そのため、「apple」「grape」までしか出力されません。
「JavaScript」のfor文は、同じ処理を複数回繰り返す際に使用できます。for文とbreak文やcontinue文を組み合わせれば、処理を途中で中断したり、特定条件でスキップしたりできます。
また、似たような働きをするものにfor…in文、for…of文、forEachメソッドなど異なる手法があり、これらにはオブジェクトに適用できる手法もあります。
繰り返し処理は、プログラミングのあらゆる場面で使用される重要な処理です。ぜひ、「JavaScript」のfor文を使った繰り返し処理をマスターしてください。
2024.06.17
子供におすすめのプログラミングスクール10選!学習メリットや教室選びのコツも紹介
#プログラミングスクール
2022.01.06
【完全版】大学生におすすめのプログラミングスクール13選!選ぶコツも詳しく解説
#プログラミングスクール
2024.01.26
【未経験でも転職可】30代におすすめプログラミングスクール8選!
#プログラミングスクール
2024.01.26
初心者必見!独学のJava学習方法とおすすめ本、アプリを詳しく解説
#JAVA
2024.01.26
忙しい社会人におすすめプログラミングスクール15選!失敗しない選び方も詳しく解説
#プログラミングスクール
2022.01.06
【無料あり】大阪のおすすめプログラミングスクール14選!スクール選びのコツも紹介
#プログラミングスクール
2024.01.26
【目的別】東京のおすすめプログラミングスクール20選!スクール選びのコツも徹底解説
#プログラミングスクール
2024.01.26
【無料あり】福岡のおすすめプログラミングスクール13選!選び方も詳しく解説
#プログラミングスクール
2024.01.26
【徹底比較】名古屋のおすすめプログラミングスクール13選!選び方も詳しく解説
#プログラミングスクール
2024.01.26
【徹底比較】おすすめのプログラミングスクール18選!失敗しない選び方も徹底解説
#プログラミングスクール