進め方の地図
| 週 | やること | 仕上がるもの |
|---|---|---|
| 1週目 | 授業1: 変数と型 ― コンソールは実験室 | 小問10本 |
| 2週目 | 授業2: 条件分岐と繰り返し | FizzBuzzほか小問8本 |
| 3週目 | 授業3: 関数 ― 部品化の考え方 | 関数の小問6本 |
| 4週目 | 授業4: 配列とオブジェクト | 商品リストの集計プログラム |
| 5〜6週目 | 授業5: DOMとイベント徹底 | カウンター・タブ・リスト追加 |
| 7週目 | 授業6: デバッグ ― エラーと仲直りする | エラー読解の自分用早見表 |
| 8週目 | 月末制作: 3作品のはしご | じゃんけん → クイズ → 電卓 |
授業1: 変数と型 ― コンソールは実験室
ブラウザの開発者ツール (F12) の「Console」タブは、JavaScriptを1行ずつ試せる実験室です。ファイルを作らなくても、打てばすぐ動きます。このユニットの小問は、全部ここで解けます。
- 実験室を開くF12 → Consoleタブをクリックします。
- 変数を作る
const name = "山田";と打って Enter。続けてnameと打つと「山田」が返ります。 - 計算させる
const price = 180;→price * 3で540が返ります。 - 文字に埋め込む
`${name}さんの合計は${price * 3}円`と打ちます。バッククォート (Shift + @) で囲むと、${ }の中に変数や計算を埋め込めます。これがテンプレート文字列で、今後ずっと使う主力です。 - letとconstの違いを試す
let count = 1; count = 2;は通りますが、const x = 1; x = 2;はエラーになります。「あとで変わるものだけlet、基本はconst」が現場の定番です。
お題: コンソールで1問ずつ解きます。①自分の名前を入れた変数を作って表示する。②好きな数を2つ変数にして、足し算・掛け算を表示する。③「パン180円を4個買うと720円」という文をテンプレート文字列で組み立てる (数字は変数と計算で)。④"180" + 20 を実行して、結果がなぜ「18020」になるか考える。⑤Number("180") + 20 で直す。⑥〜⑩は④までの問題の数字や文章を、自分で差しかえて反復します。
"180" は文字列なので、+ が「足し算」ではなく「文字の連結」になります。型 (文字列か数値か) を意識する最初の関門で、ここでつまずくのは全員共通です。typeof 変数名 で型を確かめられます。授業2: 条件分岐と繰り返し ― プログラムの背骨
「もし◯◯なら」と「◯◯回繰り返す」。この2つの組み合わせが、すべてのプログラムの背骨です。世界一有名な練習問題FizzBuzzで、背骨を一気に作ります。
仕様: 1から30まで数えて、3の倍数なら「Fizz」、5の倍数なら「Buzz」、両方の倍数なら「FizzBuzz」、それ以外は数字を表示します。一気に書かず、段階で育てるのがプロの組み立て方です。
- まず数えるだけ
1〜30が出れば、繰り返しは完成です。for (let i = 1; i <= 30; i++) { console.log(i); } - 3の倍数だけ特別あつかい
for (let i = 1; i <= 30; i++) { if (i % 3 === 0) { console.log("Fizz"); } else { console.log(i); } }%は「割った余り」です。余りが0 = 倍数、はこの先もずっと使う発想です。 - 5の倍数も足す
else if (i % 5 === 0)の枝を足して「Buzz」を出します。 - 両方の倍数を最初に判定する
if (i % 15 === 0)を一番上に置いて「FizzBuzz」を出します。順番を最後にすると、先に「Fizz」に捕まって動きません。条件は厳しいものから先に書く ― これがこの例題の一番の教訓です。
お題: ①点数 (変数) が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「ためる変数を外に作って、繰り返しの中で足す」― 集計の万能パターンです。お題: 変数 me と cpu に「グー / チョキ / パー」のどれかを入れたら、「勝ち / 負け / あいこ」を表示するコードを書きます (画面はまだ不要、コンソールだけでOK)。月末制作の心臓部の先行練習です。
me === cpu の「あいこ」を片づけると、残りは勝ちパターン3つだけ書けば済みます。条件は me === "グー" && cpu === "チョキ" のように && (かつ) でつなぎます。授業3: 関数 ― 名前のついた部品を作る
同じコードを2回書いたら、関数にする合図です。関数は「材料 (引数) を受け取り、結果 (戻り値) を返す」部品です。
- 関数を定義する
function taxIncluded(price) { return Math.round(price * 1.1); } - 呼び出す
taxIncluded(180)→ 198。taxIncluded(2980)→ 3278。材料を変えれば何度でも働きます。 - 引数を増やす税率も材料にして
function taxIncluded(price, rate)に拡張し、taxIncluded(180, 0.08)(軽減税率) も計算できるようにします。 - returnの意味を確かめる
const a = taxIncluded(500, 0.1);のように、返ってきた値は変数に受け取れます。「表示する (console.log)」と「返す (return)」の違いが、関数の一番大事な感覚です。
お題: ①名前を渡すと「◯◯さん、こんにちは!」を返す関数。②点数を渡すと「合格 / あと少し / 再挑戦」を返す関数 (演習2-Aの①を関数化)。③金額の配列ではなく、まず2つの引数の大きい方を返す関数 max2(a, b)。
console.log(max2(3, 7), max2(10, 2), max2(5, 5)) のように、まとめて検査する癖をつけましょう。これがテストの第一歩です。お題: 自分がStep 3で書いた作品 (または月末制作の途中コード) から、「ほぼ同じ処理の繰り返し」を1か所見つけて、関数にまとめます。
授業4: 配列とオブジェクト ― データの塊を扱う
実務のデータは、ほぼ全部「オブジェクトの配列」の形でやってきます。商品リスト・利用者一覧・投稿一覧、全部この形です。ここに慣れると、ユニット3の通信 (JSON) がそのまま読めるようになります。
- データを作る
const items = [ { name: "メロンパン", price: 180, stock: 5 }, { name: "クロワッサン", price: 220, stock: 3 }, { name: "あんぱん", price: 160, stock: 0 } ]; - 1件取り出す
items[0].name→ 「メロンパン」。[番号]で行を、.名前で項目を選びます。 - 全部回す
for (const item of items) { console.log(`${item.name}: ${item.price}円`); }for...ofは「配列を1件ずつ取り出す」専用の書き方です。 - 条件つきで集計する「在庫がある商品の合計金額」を、授業2の集計パターンで計算します。
let total = 0; for (const item of items) { if (item.stock > 0) { total += item.price * item.stock; } }
お題: 例題の items に商品を2つ書き足してから、①商品名だけを全部表示する。②一番高い商品の名前を表示する。③在庫切れ (stockが0) の商品だけ表示する。④「全商品の平均価格」を計算する。
if (item.price > maxPrice) のたびに更新します。max2関数 (演習3-A) と同じ発想が、配列でも通用します。お題: ③ (在庫切り) を items.filter(...) で、① (名前一覧) を items.map(...) で書き直します。
items.filter(item => item.stock === 0) のように書きます。forで書けることを知った上で短く書くのがプロの順序です。意味が腑に落ちなければ、今はforのままで先へ進んで構いません。授業5: DOMとイベント ― 画面とつなぐ
ここまでの力を、ついに画面につなぎます。型はいつも同じ3行です ― ①要素をつかむ → ②イベントを待ち受ける → ③中身を書き換える。
- HTMLを用意する
<p>押した回数: <span id="count">0</span> 回</p> <button id="plus">+1</button> <script src="app.js"></script> - app.jsに3行の型を書く
const countEl = document.querySelector("#count"); // ① つかむ let count = 0; document.querySelector("#plus").addEventListener("click", () => { // ② 待ち受ける count++; countEl.textContent = count; // ③ 書き換える }); - 動かして、育てるボタンを押して数字が増えたら、「-1ボタン」「リセットボタン」を自分で足します。型の反復練習です。
- 仕上げの一工夫10回以上で文字を赤くしてみます。
if (count >= 10) { countEl.style.color = "red"; }― 分岐と画面操作の合流点です。
お題: テキスト入力欄の下に「いま◯文字」とリアルタイム表示します。SNSの文字数表示と同じ仕組みです。
- HTML:
<textarea id="memo"></textarea>と表示用のspanを置きます。 - イベントは "input": クリックではなく、
addEventListener("input", ...)で「入力のたび」に反応させます。 - 文字数は .value.length: 入力欄の中身は
.textContentではなく.valueで取るのが落とし穴ポイントです。
button.disabled = true) にも挑戦しましょう。お題: ①ボタン3つで表示エリアの中身が切り替わる「タブ」。②入力欄の文字を li として一覧に追加していく「リスト追加」(ToDoアプリの前身です)。
document.createElement("li") で作り、list.appendChild(li) でぶら下げます。①は「全部のタブを一度隠してから、選ばれた1つだけ表示」の順に書くと混乱しません。授業6: デバッグ ― エラーと仲直りする技術
エラーは敵ではなく、「どこで何に困っているか」を教えてくれる案内板です。ジュニアに必要なのは、エラーを出さない力ではなく、エラーから戻ってくる力です。三大エラーの読み方を覚えましょう。
| エラー名 | 意味 | まず疑う場所 |
|---|---|---|
| SyntaxError | 文法ミス | 括弧・引用符の閉じ忘れ。エラー行の1行上も見る |
| ReferenceError | その名前は知らない | 変数名・関数名の打ちまちがい |
| TypeError (null) | つかめていない物を操作した | querySelectorのID違い、scriptタグの位置がHTMLより上 |
お題: 例題のカウンターを、わざと3通りに壊して、エラー文を読んでから直します。①querySelector("#count") のIDを存在しない名前に変える。②変数名を1文字違いにする。③括弧を1つ消す。それぞれ、出たエラー名と意味を自分の早見表にメモします。
月末制作: 3作品のはしご
難度が階段になった3作品です。1段目はリードつき、3段目はリードなし ― 2ヶ月の成長を自分で確かめましょう。
- 1段目: じゃんけんゲーム (リードつき)グー・チョキ・パーの3ボタン → コンピューターの手は
Math.floor(Math.random() * 3)で0〜2の乱数から選ぶ → 演習2-Bの判定コードを関数にして勝敗表示 → 勝ち数・負け数をカウンター (授業5) で記録。部品は全部そろっています。組み立てるだけです。 - 2段目: 3問クイズ (ヒントだけ)問題はオブジェクトの配列
[{ q: "問題文", a: ["選択肢1", "選択肢2", "選択肢3"], correct: 0 }, ...]に持たせ、1問ずつ表示 → 答えるごとに得点 → 最後に「3問中◯問正解!」。データとプログラムを分けるのがテーマです。問題の追加がデータ1行で済めば大成功です。 - 3段目: 電卓 (リードなし)数字ボタンと + − × ÷ = で動く電卓を作ります。見た目はGridの出番です。仕様の細部 (連続で = を押したら? 0で割ったら?) を自分で決めるのも課題のうちです。
- 3つともGitHubへコミットを積みながら作り、完成したらスタッフに遊んでもらいましょう。「人に遊んでもらって壊れない」が、このユニットの合格ラインです。
つまずきやすいポイント
発展チャレンジ (余力のある方へ)
- じゃんけんに「連勝記録」と「連勝が途切れたら励ましのメッセージ」を足してみましょう。
- クイズの問題データを10問に増やし、「毎回ランダムに3問だけ出す」仕様に改造してみましょう (配列のシャッフルを調べることになります)。
- アロー関数 (
const f = (x) => x * 2;) を調べて、自分の関数を1つ書き直してみましょう。今後の教材コードにも登場する書き方です。