プロへの道 » フロントエンドコース » ユニット2

フロントエンドコース ユニット2 | 目安: 160時間 (約2ヶ月)

JavaScript徹底基礎 ― 読める・書けるを作る2ヶ月

Step 3でJavaScriptに入門したときの武器を、ここで「迷わず使える道具」に鍛え直します。新しい知識より、演習の量が主役のユニットです。1問1問は小さく、答えもついています。量をこなした人から、コードがすらすら読めるようになります。

このユニットのゴール 変数・分岐・繰り返し・関数・配列・DOM操作を組み合わせて、「仕様を聞いて、小さなプログラムを自力で書ける」状態になる。

進め方の地図

やること 仕上がるもの
1週目 授業1: 変数と型 ― コンソールは実験室 小問10本
2週目 授業2: 条件分岐と繰り返し FizzBuzzほか小問8本
3週目 授業3: 関数 ― 部品化の考え方 関数の小問6本
4週目 授業4: 配列とオブジェクト 商品リストの集計プログラム
5〜6週目 授業5: DOMとイベント徹底 カウンター・タブ・リスト追加
7週目 授業6: デバッグ ― エラーと仲直りする エラー読解の自分用早見表
8週目 月末制作: 3作品のはしご じゃんけん → クイズ → 電卓
このユニットの進め方: 小問は、まず自力で5〜15分 → 詰まったら答えを見て写す → 何も見ずにもう一度書く、の3拍子で進めます。最後の「もう一度」を飛ばさないことが、定着の分かれ目です。

授業1: 変数と型 ― コンソールは実験室

ブラウザの開発者ツール (F12) の「Console」タブは、JavaScriptを1行ずつ試せる実験室です。ファイルを作らなくても、打てばすぐ動きます。このユニットの小問は、全部ここで解けます。

例題 (リードつき) | コンソールで変数の感覚をつかむ
  1. 実験室を開くF12 → Consoleタブをクリックします。
  2. 変数を作るconst name = "山田"; と打って Enter。続けて name と打つと「山田」が返ります。
  3. 計算させるconst price = 180;price * 3 で540が返ります。
  4. 文字に埋め込む`${name}さんの合計は${price * 3}円` と打ちます。バッククォート (Shift + @) で囲むと、${ } の中に変数や計算を埋め込めます。これがテンプレート文字列で、今後ずっと使う主力です。
  5. letとconstの違いを試すlet count = 1; count = 2; は通りますが、const x = 1; x = 2; はエラーになります。「あとで変わるものだけlet、基本はconst」が現場の定番です。
演習 1-A (リードつき) | 小問10本

お題: コンソールで1問ずつ解きます。①自分の名前を入れた変数を作って表示する。②好きな数を2つ変数にして、足し算・掛け算を表示する。③「パン180円を4個買うと720円」という文をテンプレート文字列で組み立てる (数字は変数と計算で)。④"180" + 20 を実行して、結果がなぜ「18020」になるか考える。⑤Number("180") + 20 で直す。⑥〜⑩は④までの問題の数字や文章を、自分で差しかえて反復します。

④の答え: "180" は文字列なので、+ が「足し算」ではなく「文字の連結」になります。型 (文字列か数値か) を意識する最初の関門で、ここでつまずくのは全員共通です。typeof 変数名 で型を確かめられます。

授業2: 条件分岐と繰り返し ― プログラムの背骨

「もし◯◯なら」と「◯◯回繰り返す」。この2つの組み合わせが、すべてのプログラムの背骨です。世界一有名な練習問題FizzBuzzで、背骨を一気に作ります。

例題 (リードつき) | FizzBuzzを4段階で組み立てる

仕様: 1から30まで数えて、3の倍数なら「Fizz」、5の倍数なら「Buzz」、両方の倍数なら「FizzBuzz」、それ以外は数字を表示します。一気に書かず、段階で育てるのがプロの組み立て方です。

  1. まず数えるだけ
    for (let i = 1; i <= 30; i++) {
      console.log(i);
    }
    1〜30が出れば、繰り返しは完成です。
  2. 3の倍数だけ特別あつかい
    for (let i = 1; i <= 30; i++) {
      if (i % 3 === 0) {
        console.log("Fizz");
      } else {
        console.log(i);
      }
    }
    % は「割った余り」です。余りが0 = 倍数、はこの先もずっと使う発想です。
  3. 5の倍数も足すelse if (i % 5 === 0) の枝を足して「Buzz」を出します。
  4. 両方の倍数を最初に判定するif (i % 15 === 0)一番上に置いて「FizzBuzz」を出します。順番を最後にすると、先に「Fizz」に捕まって動きません。条件は厳しいものから先に書く ― これがこの例題の一番の教訓です。
演習 2-A (リードつき) | 小問4本

お題: ①点数 (変数) が80以上なら「合格」、60以上なら「あと少し」、それ未満なら「再挑戦」と表示する。②1〜100の合計を計算する (合計用の変数を0で作り、forで足しこむ)。③九九の7の段を「7 × 1 = 7」の形で表示する。④1〜20のうち偶数だけ表示する。

②の答え:
let total = 0;
for (let i = 1; i <= 100; i++) {
  total = total + i;
}
console.log(total); // 5050
「ためる変数を外に作って、繰り返しの中で足す」― 集計の万能パターンです。
演習 2-B (ヒントだけ) | じゃんけんの判定だけ作る

お題: 変数 mecpu に「グー / チョキ / パー」のどれかを入れたら、「勝ち / 負け / あいこ」を表示するコードを書きます (画面はまだ不要、コンソールだけでOK)。月末制作の心臓部の先行練習です。

ヒント: まず me === cpu の「あいこ」を片づけると、残りは勝ちパターン3つだけ書けば済みます。条件は me === "グー" && cpu === "チョキ" のように && (かつ) でつなぎます。

授業3: 関数 ― 名前のついた部品を作る

同じコードを2回書いたら、関数にする合図です。関数は「材料 (引数) を受け取り、結果 (戻り値) を返す」部品です。

例題 (リードつき) | 税込価格の関数を作って育てる
  1. 関数を定義する
    function taxIncluded(price) {
      return Math.round(price * 1.1);
    }
  2. 呼び出すtaxIncluded(180) → 198。taxIncluded(2980) → 3278。材料を変えれば何度でも働きます。
  3. 引数を増やす税率も材料にして function taxIncluded(price, rate) に拡張し、taxIncluded(180, 0.08) (軽減税率) も計算できるようにします。
  4. returnの意味を確かめるconst a = taxIncluded(500, 0.1); のように、返ってきた値は変数に受け取れます。「表示する (console.log)」と「返す (return)」の違いが、関数の一番大事な感覚です。
演習 3-A (リードつき) | 小問3本

お題: ①名前を渡すと「◯◯さん、こんにちは!」を返す関数。②点数を渡すと「合格 / あと少し / 再挑戦」を返す関数 (演習2-Aの①を関数化)。③金額の配列ではなく、まず2つの引数の大きい方を返す関数 max2(a, b)

確かめ方 (共通の答え): 関数は「3回呼んで3回正しい」を確認して完成とします。console.log(max2(3, 7), max2(10, 2), max2(5, 5)) のように、まとめて検査する癖をつけましょう。これがテストの第一歩です。
演習 3-B (ヒントだけ) | コピペコードを関数で掃除する

お題: 自分がStep 3で書いた作品 (または月末制作の途中コード) から、「ほぼ同じ処理の繰り返し」を1か所見つけて、関数にまとめます。

ヒント: 「コピーして数字だけ変えた行」が候補です。その変わる部分こそが引数になります。掃除の前後で動きが変わらないことの確認まで含めて1セットです。

授業4: 配列とオブジェクト ― データの塊を扱う

実務のデータは、ほぼ全部「オブジェクトの配列」の形でやってきます。商品リスト・利用者一覧・投稿一覧、全部この形です。ここに慣れると、ユニット3の通信 (JSON) がそのまま読めるようになります。

例題 (リードつき) | 商品リストを集計する
  1. データを作る
    const items = [
      { name: "メロンパン", price: 180, stock: 5 },
      { name: "クロワッサン", price: 220, stock: 3 },
      { name: "あんぱん", price: 160, stock: 0 }
    ];
  2. 1件取り出すitems[0].name → 「メロンパン」。[番号] で行を、.名前 で項目を選びます。
  3. 全部回す
    for (const item of items) {
      console.log(`${item.name}: ${item.price}円`);
    }
    for...of は「配列を1件ずつ取り出す」専用の書き方です。
  4. 条件つきで集計する「在庫がある商品の合計金額」を、授業2の集計パターンで計算します。
    let total = 0;
    for (const item of items) {
      if (item.stock > 0) {
        total += item.price * item.stock;
      }
    }
演習 4-A (リードつき) | 小問4本

お題: 例題の items に商品を2つ書き足してから、①商品名だけを全部表示する。②一番高い商品の名前を表示する。③在庫切れ (stockが0) の商品だけ表示する。④「全商品の平均価格」を計算する。

②の答えの骨格: 「いまの最高額」を覚える変数を作り、forの中で if (item.price > maxPrice) のたびに更新します。max2関数 (演習3-A) と同じ発想が、配列でも通用します。
演習 4-B (ヒントだけ) | filterとmapを試す

お題: ③ (在庫切り) を items.filter(...) で、① (名前一覧) を items.map(...) で書き直します。

ヒント: items.filter(item => item.stock === 0) のように書きます。forで書けることを知った上で短く書くのがプロの順序です。意味が腑に落ちなければ、今はforのままで先へ進んで構いません。

授業5: DOMとイベント ― 画面とつなぐ

ここまでの力を、ついに画面につなぎます。型はいつも同じ3行です ― ①要素をつかむ → ②イベントを待ち受ける → ③中身を書き換える

例題 (リードつき) | カウンターを作る
  1. HTMLを用意する
    <p>押した回数: <span id="count">0</span> 回</p>
    <button id="plus">+1</button>
    <script src="app.js"></script>
  2. app.jsに3行の型を書く
    const countEl = document.querySelector("#count"); // ① つかむ
    let count = 0;
    
    document.querySelector("#plus").addEventListener("click", () => { // ② 待ち受ける
      count++;
      countEl.textContent = count; // ③ 書き換える
    });
  3. 動かして、育てるボタンを押して数字が増えたら、「-1ボタン」「リセットボタン」を自分で足します。型の反復練習です。
  4. 仕上げの一工夫10回以上で文字を赤くしてみます。if (count >= 10) { countEl.style.color = "red"; } ― 分岐と画面操作の合流点です。
演習 5-A (リードつき) | 文字数カウンター

お題: テキスト入力欄の下に「いま◯文字」とリアルタイム表示します。SNSの文字数表示と同じ仕組みです。

  1. HTML: <textarea id="memo"></textarea> と表示用の span を置きます。
  2. イベントは "input": クリックではなく、addEventListener("input", ...) で「入力のたび」に反応させます。
  3. 文字数は .value.length: 入力欄の中身は .textContent ではなく .value で取るのが落とし穴ポイントです。
発展の種 (答えつき): 100文字を超えたら残り文字数を赤にする ― 例題の手順4と同じ型でできます。できたら、140文字で「投稿ボタンを押せなくする」(button.disabled = true) にも挑戦しましょう。
演習 5-B (ヒントだけ) | タブ切り替え / リスト追加

お題: ①ボタン3つで表示エリアの中身が切り替わる「タブ」。②入力欄の文字を li として一覧に追加していく「リスト追加」(ToDoアプリの前身です)。

ヒント: ②の新しい要素は document.createElement("li") で作り、list.appendChild(li) でぶら下げます。①は「全部のタブを一度隠してから、選ばれた1つだけ表示」の順に書くと混乱しません。

授業6: デバッグ ― エラーと仲直りする技術

エラーは敵ではなく、「どこで何に困っているか」を教えてくれる案内板です。ジュニアに必要なのは、エラーを出さない力ではなく、エラーから戻ってくる力です。三大エラーの読み方を覚えましょう。

エラー名意味まず疑う場所
SyntaxError文法ミス括弧・引用符の閉じ忘れ。エラー行の1行上も見る
ReferenceErrorその名前は知らない変数名・関数名の打ちまちがい
TypeError (null)つかめていない物を操作したquerySelectorのID違い、scriptタグの位置がHTMLより上
演習 6-A (リードつき) | わざと壊して、3回直す

お題: 例題のカウンターを、わざと3通りに壊して、エラー文を読んでから直します。①querySelector("#count") のIDを存在しない名前に変える。②変数名を1文字違いにする。③括弧を1つ消す。それぞれ、出たエラー名と意味を自分の早見表にメモします。

困ったときの最終手段 (実は正攻法): エラー文とコードをそのままAIに貼って「原因と直し方を教えて」と聞きます。そのとき返ってきた説明を自分の言葉で早見表に書き足すところまでやれば、それは立派な学習です。

月末制作: 3作品のはしご

月末制作

難度が階段になった3作品です。1段目はリードつき、3段目はリードなし ― 2ヶ月の成長を自分で確かめましょう。

  1. 1段目: じゃんけんゲーム (リードつき)グー・チョキ・パーの3ボタン → コンピューターの手は Math.floor(Math.random() * 3) で0〜2の乱数から選ぶ → 演習2-Bの判定コードを関数にして勝敗表示 → 勝ち数・負け数をカウンター (授業5) で記録。部品は全部そろっています。組み立てるだけです。
  2. 2段目: 3問クイズ (ヒントだけ)問題はオブジェクトの配列 [{ q: "問題文", a: ["選択肢1", "選択肢2", "選択肢3"], correct: 0 }, ...] に持たせ、1問ずつ表示 → 答えるごとに得点 → 最後に「3問中◯問正解!」。データとプログラムを分けるのがテーマです。問題の追加がデータ1行で済めば大成功です。
  3. 3段目: 電卓 (リードなし)数字ボタンと + − × ÷ = で動く電卓を作ります。見た目はGridの出番です。仕様の細部 (連続で = を押したら? 0で割ったら?) を自分で決めるのも課題のうちです。
  4. 3つともGitHubへコミットを積みながら作り、完成したらスタッフに遊んでもらいましょう。「人に遊んでもらって壊れない」が、このユニットの合格ラインです。
見本 (答え) の場所: クイズは Step 3の見本 quiz-mihon.html が原型です。まず自力 → 詰まったら見本のソースを読む、の順で使いましょう。電卓の見本はあえて置いていません。仕様を決めるところからが、3段目の演習だからです。

つまずきやすいポイント

「読めるのに書けない」期がきたら: 全員が通る正常な段階です。処方せんは「写経 → 白紙再現」。例題を写して動かしたら、ファイルを閉じて白紙から同じものを書きます。3回やって書けたものは、もう自分の道具です。
演習の量が多くて気が遠くなったら: 1日に進む量は「小問3本」で十分です。160時間は、それでちゃんと終わる設計になっています。早さより「白紙再現できたか」を基準に進みましょう。

発展チャレンジ (余力のある方へ)

発展チャレンジ
  • じゃんけんに「連勝記録」と「連勝が途切れたら励ましのメッセージ」を足してみましょう。
  • クイズの問題データを10問に増やし、「毎回ランダムに3問だけ出す」仕様に改造してみましょう (配列のシャッフルを調べることになります)。
  • アロー関数 (const f = (x) => x * 2;) を調べて、自分の関数を1つ書き直してみましょう。今後の教材コードにも登場する書き方です。

できたチェック