はじめに
JavaScriptを学ぶ入口では、文法だけを暗記するより、HTMLの要素を取得し、CSSの見た目を変え、clickなどの操作に反応させる流れを早くつかむほうが理解しやすくなります。初心者がつまずきやすいのは、letやconstの違いよりも、書いた処理が画面のどこに影響するのかを結び付ける部分です。
そのため、変数、条件分岐、関数、DOM操作、イベント処理を一続きの流れとして扱います。サンプルコードはブラウザで読みやすい小さな単位に分け、各コードの直後に期待される表示や動きを添えますが、これは押さえたい点です。
- ECMAScript 2024 相当の標準的な構文
- Google Chrome 126 / Firefox 126 / Microsoft Edge 126 相当のモダンブラウザ
- HTML Living Standard / DOM Standard に沿ったブラウザAPI
- JavaScriptの役割と、HTML・CSSとのつながり
let、const、if、for、functionの使いどころdocument.getElementById()やaddEventListener()によるDOM操作- 初心者が読み替えやすいサンプルコードの分解方法
- フォーム、タブ、モーダル、タイマーなどの実装パターン
JavaScriptとは
JavaScriptは、Webページに動きを加えるために広く使われるプログラミング言語です。HTMLが文書構造、CSSが見た目を受け持つのに対し、JavaScriptはボタン操作、入力チェック、表示切り替え、通信処理などを制御します。
一般に、ブラウザ上の処理はdocumentから要素を探し、取得したElementのtextContent、style、classListなどを変える形で進みます。公式ドキュメントによれば、DOMは文書をオブジェクトとして扱う仕組みであり、要素の取得や更新はMDNのDOM解説でも体系的に整理されているのが基本です。
これを学ぶと、静的なページに反応を持たせられます。たとえばJavaScriptイベント徹底解説のようにイベント処理だけを深掘りする前でも、click、submit、mouseoverの考え方を押さえると小さなUIを作れます。
| 分類 | 主な構文/API | 役割 | 初心者の着眼点 | 関連する例 |
|---|---|---|---|---|
| 変数 | let | 後から変わる値を保持 | 再代入の有無を見る | タイマーの秒数 |
| 定数 | const | 変えない参照を保持 | 初期化後に代入し直さない | DOM要素の参照 |
| 数値 | Number | 計算対象の値 | 文字列との混同を避ける | 残り秒数 |
| 文字列 | String | 画面表示用の値 | テンプレートリテラルを使う | メッセージ表示 |
| 真偽値 | Boolean | 条件の判定 | trueとfalseを区別 | 開閉状態 |
| 配列 | Array | 複数データの保持 | 添字は0から始まる | タブ一覧 |
| オブジェクト | Object | 名前付き値の集合 | プロパティ名を読む | 設定情報 |
| 条件分岐 | if | 条件で処理を分ける | 条件式を小さく書く | 入力チェック |
| 分岐 | else | 条件外の処理 | 正常系と異常系を分ける | エラー表示 |
| 反復 | for | 決まった回数の処理 | 終了条件を見る | リスト処理 |
| 反復 | forEach() | 配列要素ごとの処理 | 戻り値ではなく副作用を見る | タブ設定 |
| 関数 | function | 処理の再利用 | 引数と戻り値を分ける | タイマー更新 |
| 戻り値 | return | 結果を呼び出し元へ返す | 途中終了にも使う | 空入力の除外 |
| 要素取得 | getElementById() | IDから要素を探す | ID重複を避ける | ボタン取得 |
| 要素取得 | querySelectorAll() | 複数要素を探す | 戻り値は配列風 | アコーディオン |
| イベント | addEventListener() | 操作に処理を結び付ける | イベント名を確認 | クリック処理 |
| 表示内容 | textContent | 文字を安全に入れる | HTMLとして解釈しない | ToDo追加 |
| HTML挿入 | innerHTML | HTML文字列を入れる | 入力値には慎重 | テンプレート |
| スタイル | style.display | 表示状態を変える | CSS設計と合わせる | メニュー開閉 |
| クラス | classList.add() | クラスを追加 | 見た目はCSSに寄せる | モーダル |
| クラス | classList.remove() | クラスを外す | 状態名を明確にする | スライド |
| 作成 | createElement() | 新しい要素を作る | 追加先を決める | リスト項目 |
| 追加 | appendChild() | 子要素として追加 | DOM更新回数を見る | ドラッグ移動 |
| 入力 | value | フォーム値を読む | 空文字を判定 | メール入力 |
| 中止 | preventDefault() | 既定動作を止める | 送信やドロップで使う | バリデーション |
| 正規表現 | match() | 文字列パターン判定 | 厳密すぎない設計 | メール形式 |
| タイマー | setInterval() | 一定間隔で処理 | 解除処理とセット | カウントダウン |
| 解除 | clearInterval() | タイマー停止 | IDを保持する | 停止ボタン |
| 乱数 | Math.random() | ランダム値を作る | 範囲変換が必要 | 色変更 |
| 丸め | Math.floor() | 小数を切り捨て | 0から上限未満 | RGB値 |
JavaScriptの基本
JavaScriptの基礎は、値を入れる、条件で分ける、繰り返す、処理を関数へまとめる、という順で整理すると読みやすくなります。これらは単独で覚えるより、画面の要素を動かす前準備として見ると役割が明確になります。
その理解を補うため、公式ドキュメントへの参照も押さえておくと学習が安定するのが目安です。言語構文はMDN JavaScriptガイド、イベント登録はMDN addEventListenerで確認できます。
変数とデータ型
変数は、プログラム内で値に名前を付けて扱う仕組みです。letは後から値を変える場面、constは参照を変えない場面に向いており、初心者はDOM要素の参照をconstにする感覚から始めると整理しやすくなります。
結果: 期待される出力はありませんが、numberには10、messageには文字列、flagにはtrueが保持されますし、これが一つの目安です。
JavaScriptでは、Number、String、Booleanの違いを意識します。値の種類が分かると、計算に使う値、画面に出す値、条件判定に使う値を分けて読めます。
制御構文
条件分岐は、入力値や状態に応じて処理を切り替えるために使いるのがポイントです。ifの条件式が真なら最初のブロック、偽ならelse側が選ばれるため、エラー表示や送信キャンセルと相性があります。
結果: 期待される出力はありませんが、条件式の評価結果によって処理の流れが分岐します。
繰り返し処理は、同じ形の処理を複数回行うときに使いるのが一般的です。forでは初期値、継続条件、更新式を同じ行に書くため、回数の管理が見えやすくなります。
結果: 期待される動きは、iが0から9まで変化しながらブロック内の処理が繰り返されることです。
一方、配列に対して同じ処理を当てる場合はforEach()が読みやすい場面もあります。詳しい使い分けはforEach・mapの使い分け術やforEachでreturnを活用するテクニックも参考になるのが現実的です。
関数
関数は、一連の処理に名前を付けて再利用するためのまとまりです。functionで宣言し、必要なら引数で外から値を受け取り、returnで結果を返します。
結果: 期待される出力は関数内の処理次第ですが、呼び出し時に引数が渡され、returnの値が呼び出し元へ返ります。
JavaScriptでは、タイマーの表示更新やタスク追加のように何度も使う処理を短く呼び出せますが、覚えておくと役立つでしょう。ただし、関数が長くなりすぎると読みづらくなるため、入力を読む処理、表示を変える処理、判定する処理を分けると保守しやすくなります。
💡 Tips: 変数名や関数名は、dataやrunのような抽象名より、emailInput、updateTimerのように役割が分かる名前にすると後から読み返しやすくなります。
JavaScriptの使い方
基本構文を画面に結び付けるときは、DOM要素を取得し、イベントに処理を登録し、必要なプロパティを更新する流れになると整理できます。これが分かると、ボタン、フォーム、画像、リストなどのサンプルコードを同じ型として読めます。
HTMLとの連携
HTMLとの連携では、対象要素を正しく取得することが出発点になります。idが付いた要素ならdocument.getElementById()、複数の要素をまとめて扱うならdocument.querySelectorAll()がよく使われますし、ここを基本と考えるとよいでしょう。
結果: 期待される結果は、id="elementId"を持つ要素がelementに入ることです。該当要素がなければnullになります。
JavaScriptの取得結果がnullのままaddEventListener()を呼ぶとエラーになります。そのため、スクリプトの読み込み位置を</body>直前に置く、またはDOMContentLoaded後に処理する設計がよく使われますし、ここがポイントです。
イベントリスナー
イベントリスナーは、クリック、入力、送信、マウス操作などに処理を結び付ける仕組みです。addEventListener()は対象要素、イベント名、実行する関数を組み合わせて登録します。
結果: 期待される動きは、elementがクリックされたときに関数内の処理が呼び出されることです。
ただし、同じ要素に似た処理を何度も登録すると管理が難しくなります。イベントの詳細はイベントハンドラの実践サンプルコードでも扱われているため、クリック以外の操作を増やす段階で確認すると理解がつながりますが、これは押さえたい点です。
実践的な応用例とサンプルコード10選
サンプルコードは、HTMLで土台を作り、JavaScriptで状態を変える順に読むと迷いにくくなります。初心者向けの小さな例でも、id、class、event、styleの関係を意識すると応用しやすくなります。
JavaScriptサンプルコード1:ボタンクリックで文字色変更
JavaScriptでは、ボタンのクリックに反応してテキストの色をランダムに変えますし、これが一つの目安です。ランダム値はMath.random()とMath.floor()で作り、style.colorへrgb()形式の文字列を入れます。
結果: 期待される表示は、色変更用のボタンと、色が変わる対象のテキストです。
結果: 期待される動きは、ボタンを押すたびに段落の文字色が別のRGB値へ変わることです。
JavaScriptサンプルコード2:マウスオーバーで画像切り替え
画像切り替えでは、src属性を変更して表示する画像ファイルを変えます。ファイル拡張子やパスの扱いに迷う場合は、JavaScriptで拡張子を活用する方法も関連知識になります。
結果: 期待される表示は、image1.jpgを参照する画像要素です。画像ファイルが存在しない場合は代替テキストが表示される可能性があると理解できます。
結果: 期待される動きは、画像にマウスを重ねるとimage2.jpgへ変わり、離すと元の画像に戻ることです。
JavaScriptサンプルコード3:フォーム入力値のバリデーション
フォームでは、送信前に入力形式を確認すると誤入力を減らせます。メールアドレスの判定は厳密にしすぎると正しいアドレスまで弾くため、サンプルコードでは基本的な形式確認に留めます。
結果: 期待される表示は、メールアドレス入力欄、エラーメッセージ領域、送信ボタンです。
結果: 期待される動きは、入力値が形式に合わないとエラーメッセージが表示され、フォーム送信が止まることです。
JavaScriptではevent.preventDefault()は、ブラウザの既定の送信処理を止める役割を持ちます。セキュリティ上はクライアント側の検証だけに頼らず、サーバー側でも同じ入力を検証します。
JavaScriptサンプルコード4:ドラッグアンドドロップ
ドラッグアンドドロップは、ドラッグ開始、ドラッグ中、ドロップの各イベントを組み合わせますが、覚えておくと役立つでしょう。dataTransferに対象要素のIDを入れ、ドロップ時に取り出して移動させます。
結果: 期待される表示は、ドラッグできる青い四角形と、移動先になる枠線付きの領域です。
結果: 期待される動きは、青い要素をドロップゾーンへ移動できることです。
JavaScriptのAPIはブラウザや入力デバイスによって操作感が変わる場合があります。タッチ操作を含むUIでは、クリック選択や上下ボタンなどの代替操作も用意すると使いやすくなります。
JavaScriptサンプルコード5:アコーディオンメニュー
アコーディオンは、見出しをクリックして関連する内容を開閉するUIです。長い説明を同じページに置く場合でも、必要な部分だけを読める形にできると覚えるとよいでしょう。
結果: 期待される表示は、複数の見出しと、それぞれに対応する内容領域です。
結果: 期待される動きは、見出しをクリックするたびに直後の内容領域が開閉することです。
サンプルコード6:タブ切り替え
タブ切り替えは、複数の内容を同じ場所に置き、選ばれた項目だけを表示するUIです。NodeListの順序とコンテンツの順序を対応させると、短いコードで実装できます。
結果: 期待される表示は、タブボタン群と、各タブに対応する内容領域です。
結果: 期待される動きは、押したタブに対応する内容だけが表示されることです。
サンプルコード7:モーダルウィンドウ
モーダルは、画面上に重ねて表示する領域です。注意を集めたい入力フォームや確認メッセージに使われますが、キーボード操作や閉じる手段も合わせて考える必要があります。
結果: 期待される表示は、モーダルを開くボタンと、初期状態では非表示にするモーダル領域です。
結果: 期待される動きは、開くボタンでhiddenクラスが外れ、閉じるボタンで再び追加されることです。
ただし、モーダルを本格的に使う場合はaria-modal、フォーカス移動、Escapeキーでの閉じる動作も検討します。見た目だけを重ねると、スクリーンリーダーやキーボード利用者が操作しづらくなる可能性があります。
innerHTMLへユーザー入力をそのまま入れると、XSSの原因になる場合があると考えられます。入力値を文字として表示する用途ではtextContentを優先します。サンプルコード8:スライドショー
スライドショーは、表示中の画像を配列の添字のように管理します。現在位置をcurrentIndexに持たせ、前後のボタンとsetInterval()から同じ切り替え関数を呼びますし、ここを基本と考えるとよいでしょう。
結果: 期待される表示は、複数の画像と前後移動用のボタンです。CSSで.active以外を隠す前提になります。
結果: 期待される動きは、前後ボタンで画像が切り替わり、3秒ごとに次の画像へ進むことです。
サンプルコード9:カウントダウンタイマー
カウントダウンタイマーは、残り秒数を状態として持ち、一定間隔で減らして画面を更新します。時間表示ではString()とpadStart()を使うと、00:09のような桁揃えができます。
結果: 期待される表示は、残り時間のテキスト、開始ボタン、停止ボタンです。
結果: 期待される動きは、開始ボタンで1秒ごとに残り時間が減り、停止ボタンで更新が止まることです。
サンプルコード10:シンプルなToDoリスト
ToDoリストでは、入力欄から値を読み、新しいli要素を作り、ulへ追加します。これはDOM操作の基本形をまとめて練習できるサンプルコードです。
結果: 期待される表示は、タスク入力欄、追加ボタン、追加先になる空のリストです。
結果: 期待される動きは、入力したタスクがリスト項目として追加され、追加後に入力欄が空になることです。
注意点と対処法
JavaScriptを書くときは、動けば終わりではなく、ブラウザ差、性能、メモリ、セキュリティ、非同期処理、テストまでを意識します。こうした観点を早い段階で押さえると、サンプルコードを自分のページへ移すときの失敗を減らせます。
ブラウザ互換性
新しい構文やAPIは、利用者のブラウザで同じように動くとは限りません。そのため、Can I useやMDNの互換表を確認し、必要に応じてBabel、polyfill、代替実装を選びますし、ここがポイントです。
optional chainingやArray.prototype.at()などは対象ブラウザを確認します。- 古い環境を含める場合は、ビルド工程で構文変換を検討します。
- 機能がない場合でも操作できる代替UIを残すると言えるでしょう。
パフォーマンス
画面更新が重くなる原因の多くは、不要なループや頻繁なDOM操作です。特に大量の要素を追加する場合は、DocumentFragmentを使ってまとめて挿入すると負荷を抑えやすくなります。
- 同じ要素を何度も検索せず、取得した参照を使い回します。
- スクロールや入力イベントでは、必要に応じて
debounceやthrottleを検討するのが基本です。 - 時間のかかる処理は非同期化し、メインスレッドを長く塞がない設計にします。
メモリリーク
不要になった要素やイベントリスナーへの参照が残ると、メモリが解放されにくくなる場合があります。動的に作った画面部品を削除する処理では、関連するremoveEventListener()やタイマー解除も確認するのが目安です。
setInterval()を使ったらclearInterval()で止める経路を用意します。- 大きな配列やオブジェクトを使い終えたら参照を残さないようにします。
- クロージャが外側の値を保持し続ける構造に注意するのがポイントです。
セキュリティ
ユーザー入力を扱うコードでは、XSSを避ける設計が欠かせません。文字列をそのままHTMLとして解釈させるより、textContentで文字として挿入するほうが安全に扱えます。
eval()は通常の実装で避け、必要な処理を関数や条件分岐で表します。- 外部から受け取った値は、クライアント側とサーバー側の両方で検証するのが一般的です。
- 通信では
HTTPSを使い、認証情報や個人情報の扱いを分けます。
グローバル変数の過剰使用
グローバル変数が増えると、別のスクリプトと名前が衝突しやすくなるのが現実的です。基本的にletとconstのブロックスコープを使い、処理を関数やモジュールへ閉じ込めます。
- 複数ファイルへ分ける場合は
type="module"を検討します。 - 設定値は一つの
Objectにまとめ、名前の散らばりを抑えますが、これは押さえたい点です。 - 一時的な値は関数内で完結させ、外側へ漏らさないようにします。
非同期処理の複雑さ
通信やタイマーなどの非同期処理は、書き方が増えるほど流れを追いにくくなります。Promiseやasync/awaitを使うと、成功時と失敗時の処理を分けて読みやすくできると整理できます。
- 例外処理には
try/catchを組み合わせます。 - 通信の失敗、タイムアウト、空データを正常系とは分けて扱います。
- 同時に走る処理がある場合は、最後に反映すべき結果を明確にすると理解できます。
テストの不足
- 純粋な計算関数は単体テストに分けやすくなります。
- DOM操作を含む処理は、クリック前後の状態を確認します。
- フォームでは正常値、空値、形式違いを分けて確認すると覚えるとよいでしょう。
まとめ
JavaScriptは、変数、条件分岐、関数を土台にして、DOM操作とイベント処理で画面の反応を作る言語です。今回のサンプルコードでは、文字色変更、画像切り替え、フォーム検証、ドラッグアンドドロップ、アコーディオン、タブ、モーダル、スライドショー、タイマー、ToDoリストを扱いました。
JavaScriptの例に共通するのは、対象要素を取得し、操作に応じて状態を変え、画面へ反映する流れです。その流れを意識すると、初心者でも別のUIへ応用しやすくなります。
ただし、実際の公開ページでは、セキュリティ、アクセシビリティ、ブラウザ互換性、エラー処理も合わせて設計します。サンプルコードを出発点にしながら、公式ドキュメントでAPIの仕様を確認し、少しずつ機能を分けて育てる進め方が堅実です。
関連記事
- JavaScriptのforEachでreturnを活用する6つのテクニック
- JavaScriptエンジニア必見!forEach・mapの"目からウロコ"な使い分け術10選
- JavaScriptイベント徹底解説!30個の使い方と応用例
- JavaScriptにおけるイベントハンドラを完全ガイド!20選の実践サンプルコード付き
- JavaScriptで拡張子を活用する方法12選!初心者でも簡単にできる方法を紹介
※本記事は実在のエンジニア複数名で構成される Japanシーモア編集部が、AI支援を活用して作成・校正・公開しています。


