JS初めてのJavaScript

Day 2条件と くり返し — プログラムに判断させる

くり返し — 配列を1件ずつ処理する

for...of と forEach で配列を1件ずつ処理する。なぜ人間が手で並べず「くり返し」を使うのかを理解する。

同じことを何度も — 人間が手で書かない理由

配列の中身をすべて表示したいとき、fruits[0]、fruits[1]…と1行ずつ書くこともできます。でも100件あったら100行です。しかも件数が変わると全部書き直しになります。そこで「同じ処理を、中身ぶんだけ自動でくり返す」のがループ(くり返し)です。宛名書きを1枚ずつ手書きするか、同じ作業をコピー機に任せるか、の違いです。

手で1件ずつ書く

JAVASCRIPT
const fruits = ["りんご", "みかん", "ぶどう"];
console.log(fruits[0]);
console.log(fruits[1]);
console.log(fruits[2]);
// 件数が変わると全部書き直し

ループで自動でくり返す

JAVASCRIPT
const fruits = ["りんご", "みかん", "ぶどう"];
for (const fruit of fruits) {
  console.log(fruit);
}
// 件数が変わってもこのままでOK

for...of — 配列を1件ずつ取り出す

for...of は「配列の中身を1件ずつ取り出して、順番に処理する」書き方です。for (const 変数 of 配列) と書くと、変数に先頭から1つずつ値が入り、{ } の中がその回ごとに実行されます。読むときは「配列の の中身 of を1件ずつ fruit に入れて回す」と考えます。

JAVASCRIPT
const fruits = ["りんご", "みかん", "ぶどう"];
for (const fruit of fruits) {
  console.log("くだもの: " + fruit);
}
// くだもの: りんご
// くだもの: みかん
// くだもの: ぶどう
fruit に1件ずつ入りながら3回くり返す

console.log で「今どれを処理中か」を確認する

ループが思ったとおり動いているか不安なときは、くり返しの中で console.log を使い、いま変数に何が入っているかを毎回表示すると確かめられます。値が1件ずつ変わって出力されれば、ちゃんと全件を回れている証拠です。バグを直すときも、まずここで中身を見るのが基本です。

forEach — 配列に「これを全部にやって」と頼む

forEach は配列自身に「各要素に対してこの処理をして」と頼む書き方です。配列.forEach((要素) => { 処理 }) と書くと、for...of と同じように1件ずつ処理できます。(要素) => { } の部分は「1件ごとに実行してほしい処理」で、Day1で学んだ関数の一種です。

JAVASCRIPT
const fruits = ["りんご", "みかん", "ぶどう"];
fruits.forEach((fruit) => {
  console.log("くだもの: " + fruit);
});
// for...of と同じ結果になる
forEach は「1件ごとの処理」を関数で渡す

for...of と forEach は、どちらも「配列を1件ずつ処理する」ための道具です。読めればどちらでも構いません。まずは「配列を頭から順に全部回している」と読み取れることが大切です。

なぜ2つの書き方があるのか

for...of は途中で止めたり(break)、条件で飛ばしたりしやすく、素直に読めます。forEach は「各要素にこの処理」を短く書け、次のDayで学ぶ map など、値を作りかえる仲間とセットで覚えると便利です。今は違いを暗記するより、両方とも『全件を1件ずつ処理している』と読めれば十分です。

AIにはこう聞く

「この配列を1件ずつ表示するループを書いて」と頼めば、for...of か forEach でコードを提案してくれます。あなたは、それが本当に全件を回っているか(先頭から最後まで漏れなく処理しているか)を読んで確かめます。次のDayでは、この「1件ずつ処理する」考え方をもとに、配列を別の配列に作りかえる map を学びます。まずは「くり返しで全件を回す」感覚をここでつかんでおきましょう。

  • ループは「同じ処理を中身ぶんだけ自動でくり返す」道具。手書きの繰り返しをなくす
  • for...of は for (const 変数 of 配列) で1件ずつ取り出す
  • forEach は 配列.forEach((要素) => { 処理 }) で1件ずつ処理する
  • くり返しの中で console.log すると、今どの値を処理中か確認できる
  • どちらも「全件を1件ずつ処理する」ための道具。次のDayの map につながる

読んでも腑に落ちない所は、AIに噛み砕いてもらいましょう。

理解度チェック

答えられれば、面接で説明できる状態に一歩近づきます。

Q1

const nums = [10, 20, 30]; に対して for (const n of nums) { console.log(n); } を実行すると、どうなりますか。

Q2

配列 items を1件ずつ処理する書き方として正しいものはどれですか。

Q3

配列の全要素に同じ処理をするとき、fruits[0]、fruits[1]… と手で書かずにループを使うのは、なぜですか。

記述式です。まず自分の言葉で答えを考えてから、模範解答を開いて自己採点してください。