読み込み中...

初心者でも分かる!JavaScript入門とサンプルコード実践例10選

JavaScript初心者向けの詳細な解説と実践例 JS
この記事は約30分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

本記事のサンプルコードを活用して機能追加、目的を達成できるように作ってありますので、是非ご活用ください。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を満たす現役のプログラマチームによって監修されています。

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

JavaScriptを学ぶ入口では、文法だけを暗記するより、HTMLの要素を取得し、CSSの見た目を変え、clickなどの操作に反応させる流れを早くつかむほうが理解しやすくなります。初心者がつまずきやすいのは、letconstの違いよりも、書いた処理が画面のどこに影響するのかを結び付ける部分です。

そのため、変数、条件分岐、関数、DOM操作、イベント処理を一続きの流れとして扱います。サンプルコードはブラウザで読みやすい小さな単位に分け、各コードの直後に期待される表示や動きを添えますが、これは押さえたい点です。

動作確認環境
  • ECMAScript 2024 相当の標準的な構文
  • Google Chrome 126 / Firefox 126 / Microsoft Edge 126 相当のモダンブラウザ
  • HTML Living Standard / DOM Standard に沿ったブラウザAPI
📖 この記事で学べること
  • JavaScriptの役割と、HTML・CSSとのつながり
  • letconstifforfunctionの使いどころ
  • document.getElementById()addEventListener()によるDOM操作
  • 初心者が読み替えやすいサンプルコードの分解方法
  • フォーム、タブ、モーダル、タイマーなどの実装パターン

JavaScriptとは

JavaScriptは、Webページに動きを加えるために広く使われるプログラミング言語です。HTMLが文書構造、CSSが見た目を受け持つのに対し、JavaScriptはボタン操作、入力チェック、表示切り替え、通信処理などを制御します。

一般に、ブラウザ上の処理はdocumentから要素を探し、取得したElementtextContentstyleclassListなどを変える形で進みます。公式ドキュメントによれば、DOMは文書をオブジェクトとして扱う仕組みであり、要素の取得や更新はMDNのDOM解説でも体系的に整理されているのが基本です。

これを学ぶと、静的なページに反応を持たせられます。たとえばJavaScriptイベント徹底解説のようにイベント処理だけを深掘りする前でも、clicksubmitmouseoverの考え方を押さえると小さなUIを作れます。

分類主な構文/API役割初心者の着眼点関連する例
変数let後から変わる値を保持再代入の有無を見るタイマーの秒数
定数const変えない参照を保持初期化後に代入し直さないDOM要素の参照
数値Number計算対象の値文字列との混同を避ける残り秒数
文字列String画面表示用の値テンプレートリテラルを使うメッセージ表示
真偽値Boolean条件の判定truefalseを区別開閉状態
配列Array複数データの保持添字は0から始まるタブ一覧
オブジェクトObject名前付き値の集合プロパティ名を読む設定情報
条件分岐if条件で処理を分ける条件式を小さく書く入力チェック
分岐else条件外の処理正常系と異常系を分けるエラー表示
反復for決まった回数の処理終了条件を見るリスト処理
反復forEach()配列要素ごとの処理戻り値ではなく副作用を見るタブ設定
関数function処理の再利用引数と戻り値を分けるタイマー更新
戻り値return結果を呼び出し元へ返す途中終了にも使う空入力の除外
要素取得getElementById()IDから要素を探すID重複を避けるボタン取得
要素取得querySelectorAll()複数要素を探す戻り値は配列風アコーディオン
イベントaddEventListener()操作に処理を結び付けるイベント名を確認クリック処理
表示内容textContent文字を安全に入れるHTMLとして解釈しないToDo追加
HTML挿入innerHTMLHTML文字列を入れる入力値には慎重テンプレート
スタイル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にする感覚から始めると整理しやすくなります。

// 変数宣言と代入
let number = 10;      // 数値
const message = 'こんにちは'; // 文字列
let flag = true;      // 真偽値

結果: 期待される出力はありませんが、numberには10messageには文字列、flagにはtrueが保持されますし、これが一つの目安です。

JavaScriptでは、NumberStringBooleanの違いを意識します。値の種類が分かると、計算に使う値、画面に出す値、条件判定に使う値を分けて読めます。

制御構文

条件分岐は、入力値や状態に応じて処理を切り替えるために使いるのがポイントです。ifの条件式が真なら最初のブロック、偽ならelse側が選ばれるため、エラー表示や送信キャンセルと相性があります。

// if文
if (条件式) {
} else {
}

結果: 期待される出力はありませんが、条件式の評価結果によって処理の流れが分岐します。

繰り返し処理は、同じ形の処理を複数回行うときに使いるのが一般的です。forでは初期値、継続条件、更新式を同じ行に書くため、回数の管理が見えやすくなります。

// for文
for (let i = 0; i < 10; i++) {
}

結果: 期待される動きは、i0から9まで変化しながらブロック内の処理が繰り返されることです。

一方、配列に対して同じ処理を当てる場合はforEach()が読みやすい場面もあります。詳しい使い分けはforEach・mapの使い分け術forEachでreturnを活用するテクニックも参考になるのが現実的です。

関数

関数は、一連の処理に名前を付けて再利用するためのまとまりです。functionで宣言し、必要なら引数で外から値を受け取り、returnで結果を返します。

// 関数宣言
function 関数名(引数1, 引数2) {
  return 戻り値;
}

// 関数呼び出し
関数名(引数1, 引数2);

結果: 期待される出力は関数内の処理次第ですが、呼び出し時に引数が渡され、returnの値が呼び出し元へ返ります。

JavaScriptでは、タイマーの表示更新やタスク追加のように何度も使う処理を短く呼び出せますが、覚えておくと役立つでしょう。ただし、関数が長くなりすぎると読みづらくなるため、入力を読む処理、表示を変える処理、判定する処理を分けると保守しやすくなります。

💡 Tips: 変数名や関数名は、datarunのような抽象名より、emailInputupdateTimerのように役割が分かる名前にすると後から読み返しやすくなります。

JavaScriptの使い方

基本構文を画面に結び付けるときは、DOM要素を取得し、イベントに処理を登録し、必要なプロパティを更新する流れになると整理できます。これが分かると、ボタン、フォーム、画像、リストなどのサンプルコードを同じ型として読めます。

HTMLとの連携

HTMLとの連携では、対象要素を正しく取得することが出発点になります。idが付いた要素ならdocument.getElementById()、複数の要素をまとめて扱うならdocument.querySelectorAll()がよく使われますし、ここを基本と考えるとよいでしょう。

// HTML要素の取得
const element = document.getElementById('elementId');

結果: 期待される結果は、id="elementId"を持つ要素がelementに入ることです。該当要素がなければnullになります。

JavaScriptの取得結果がnullのままaddEventListener()を呼ぶとエラーになります。そのため、スクリプトの読み込み位置を</body>直前に置く、またはDOMContentLoaded後に処理する設計がよく使われますし、ここがポイントです。

イベントリスナー

イベントリスナーは、クリック、入力、送信、マウス操作などに処理を結び付ける仕組みです。addEventListener()は対象要素、イベント名、実行する関数を組み合わせて登録します。

// クリックイベントのリスナーを登録
element.addEventListener('click', function() {
});

結果: 期待される動きは、elementがクリックされたときに関数内の処理が呼び出されることです。

ただし、同じ要素に似た処理を何度も登録すると管理が難しくなります。イベントの詳細はイベントハンドラの実践サンプルコードでも扱われているため、クリック以外の操作を増やす段階で確認すると理解がつながりますが、これは押さえたい点です。

実践的な応用例とサンプルコード10選

サンプルコードは、HTMLで土台を作り、JavaScriptで状態を変える順に読むと迷いにくくなります。初心者向けの小さな例でも、idclasseventstyleの関係を意識すると応用しやすくなります。

JavaScriptサンプルコード1:ボタンクリックで文字色変更

JavaScriptでは、ボタンのクリックに反応してテキストの色をランダムに変えますし、これが一つの目安です。ランダム値はMath.random()Math.floor()で作り、style.colorrgb()形式の文字列を入れます。

<button id="changeColorButton">色を変更</button>
<p id="text">このテキストの色が変わります。</p>

結果: 期待される表示は、色変更用のボタンと、色が変わる対象のテキストです。

const button = document.getElementById('changeColorButton');
const text = document.getElementById('text');

button.addEventListener('click', function() {
  text.style.color = `rgb(${Math.floor(Math.random() * 256)}, ${Math.floor(Math.random() * 256)}, ${Math.floor(Math.random() * 256)})`;
});

結果: 期待される動きは、ボタンを押すたびに段落の文字色が別のRGB値へ変わることです。

JavaScriptサンプルコード2:マウスオーバーで画像切り替え

画像切り替えでは、src属性を変更して表示する画像ファイルを変えます。ファイル拡張子やパスの扱いに迷う場合は、JavaScriptで拡張子を活用する方法も関連知識になります。

<img id="changeImage" src="image1.jpg" alt="画像">

結果: 期待される表示は、image1.jpgを参照する画像要素です。画像ファイルが存在しない場合は代替テキストが表示される可能性があると理解できます。

const image = document.getElementById('changeImage');

const originalSrc = image.src;

image.addEventListener('mouseover', function() {
  image.src = 'image2.jpg';
});

image.addEventListener('mouseout', function() {
  image.src = originalSrc;
});

結果: 期待される動きは、画像にマウスを重ねるとimage2.jpgへ変わり、離すと元の画像に戻ることです。

JavaScriptサンプルコード3:フォーム入力値のバリデーション

フォームでは、送信前に入力形式を確認すると誤入力を減らせます。メールアドレスの判定は厳密にしすぎると正しいアドレスまで弾くため、サンプルコードでは基本的な形式確認に留めます。

<form id="form">
  <label for="email">メールアドレス:</label>
  <input type="text" id="email" name="email">
  <span id="emailError" style="display:none; color:red;">正しいメールアドレスを入力してください。</span>
  <br>
  <button type="submit">送信</button>
</form>

結果: 期待される表示は、メールアドレス入力欄、エラーメッセージ領域、送信ボタンです。

const form = document.getElementById('form');
const emailInput = document.getElementById('email');
const emailError = document.getElementById('emailError');

form.addEventListener('submit', function(event) {
  if (!emailInput.value.match(/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}$/)) {
    emailError.style.display = 'inline';
    event.preventDefault();
  } else {
    emailError.style.display = 'none';
  }
});

結果: 期待される動きは、入力値が形式に合わないとエラーメッセージが表示され、フォーム送信が止まることです。

JavaScriptではevent.preventDefault()は、ブラウザの既定の送信処理を止める役割を持ちます。セキュリティ上はクライアント側の検証だけに頼らず、サーバー側でも同じ入力を検証します。

JavaScriptサンプルコード4:ドラッグアンドドロップ

ドラッグアンドドロップは、ドラッグ開始、ドラッグ中、ドロップの各イベントを組み合わせますが、覚えておくと役立つでしょう。dataTransferに対象要素のIDを入れ、ドロップ時に取り出して移動させます。

<div id="dragItem" draggable="true" style="width:100px;height:100px;background-color:blue;"></div>
<div id="dropZone" style="width:200px;height:200px;border:1px solid;"></div>

結果: 期待される表示は、ドラッグできる青い四角形と、移動先になる枠線付きの領域です。

const dragItem = document.getElementById('dragItem');
const dropZone = document.getElementById('dropZone');

dragItem.addEventListener('dragstart', function(event) {
  event.dataTransfer.setData('text/plain', dragItem.id);
});

dropZone.addEventListener('dragover', function(event) {
  event.preventDefault();
});

dropZone.addEventListener('drop', function(event) {
  event.preventDefault();

  const draggedId = event.dataTransfer.getData('text/plain');
  const draggedElement = document.getElementById(draggedId);
  dropZone.appendChild(draggedElement);
});

結果: 期待される動きは、青い要素をドロップゾーンへ移動できることです。

JavaScriptのAPIはブラウザや入力デバイスによって操作感が変わる場合があります。タッチ操作を含むUIでは、クリック選択や上下ボタンなどの代替操作も用意すると使いやすくなります。

JavaScriptサンプルコード5:アコーディオンメニュー

アコーディオンは、見出しをクリックして関連する内容を開閉するUIです。長い説明を同じページに置く場合でも、必要な部分だけを読める形にできると覚えるとよいでしょう。

<div class="accordion">
  <div class="accordion-header">メニュー1</div>
  <div class="accordion-content">
    <p>メニュー1の内容がここに表示されます。</p>
  </div>
  <div class="accordion-header">メニュー2</div>
  <div class="accordion-content">
    <p>メニュー2の内容がここに表示されます。</p>
  </div>
  <div class="accordion-header">メニュー3</div>
  <div class="accordion-content">
    <p>メニュー3の内容がここに表示されますし、ここがポイントです。</p>
  </div>
</div>

結果: 期待される表示は、複数の見出しと、それぞれに対応する内容領域です。

const accordionHeaders = document.querySelectorAll('.accordion-header');

accordionHeaders.forEach(header => {
  header.addEventListener('click', () => {
    const content = header.nextElementSibling;

    if (content.style.display === 'block') {
      content.style.display = 'none';
    } else {
      content.style.display = 'block';
    }
  });
});

結果: 期待される動きは、見出しをクリックするたびに直後の内容領域が開閉することです。

サンプルコード6:タブ切り替え

タブ切り替えは、複数の内容を同じ場所に置き、選ばれた項目だけを表示するUIです。NodeListの順序とコンテンツの順序を対応させると、短いコードで実装できます。

<div class="tab-container">
  <div class="tab-buttons">
    <button class="tab-button">タブ1</button>
    <button class="tab-button">タブ2</button>
    <button class="tab-button">タブ3</button>
  </div>
  <div class="tab-contents">
    <div class="tab-content">タブ1の内容</div>
    <div class="tab-content">タブ2の内容</div>
    <div class="tab-content">タブ3の内容</div>
  </div>
</div>

結果: 期待される表示は、タブボタン群と、各タブに対応する内容領域です。

const tabButtons = document.querySelectorAll('.tab-button');

const tabContents = document.querySelectorAll('.tab-content');

tabButtons.forEach((button, index) => {
  button.addEventListener('click', () => {
    tabContents.forEach(content => {
      content.style.display = 'none';
    });

    tabContents[index].style.display = 'block';
  });
});

結果: 期待される動きは、押したタブに対応する内容だけが表示されることです。

サンプルコード7:モーダルウィンドウ

モーダルは、画面上に重ねて表示する領域です。注意を集めたい入力フォームや確認メッセージに使われますが、キーボード操作や閉じる手段も合わせて考える必要があります。

<button id="open-modal">モーダルを開く</button>
<div id="modal" class="hidden">
  <div id="modal-content">
    <h2>モーダルウィンドウのタイトル</h2>
    <p>モーダルウィンドウの内容</p>
    <button id="close-modal">閉じる</button>
  </div>
</div>

結果: 期待される表示は、モーダルを開くボタンと、初期状態では非表示にするモーダル領域です。

const openModalButton = document.getElementById('open-modal');

const modal = document.getElementById('modal');

const closeModalButton = document.getElementById('close-modal');

openModalButton.addEventListener('click', () => {
  modal.classList.remove('hidden');
});

closeModalButton.addEventListener('click', () => {
  modal.classList.add('hidden');
});

結果: 期待される動きは、開くボタンでhiddenクラスが外れ、閉じるボタンで再び追加されることです。

ただし、モーダルを本格的に使う場合はaria-modal、フォーカス移動、Escapeキーでの閉じる動作も検討します。見た目だけを重ねると、スクリーンリーダーやキーボード利用者が操作しづらくなる可能性があります。

⚠️ 注意: innerHTMLへユーザー入力をそのまま入れると、XSSの原因になる場合があると考えられます。入力値を文字として表示する用途ではtextContentを優先します。

サンプルコード8:スライドショー

スライドショーは、表示中の画像を配列の添字のように管理します。現在位置をcurrentIndexに持たせ、前後のボタンとsetInterval()から同じ切り替え関数を呼びますし、ここを基本と考えるとよいでしょう。

<div id="slideshow">
  <img src="image1.jpg" class="slide active" alt="スライド1">
  <img src="image2.jpg" class="slide" alt="スライド2">
  <img src="image3.jpg" class="slide" alt="スライド3">
</div>
<button id="prev">前へ</button>
<button id="next">次へ</button>

結果: 期待される表示は、複数の画像と前後移動用のボタンです。CSSで.active以外を隠す前提になります。

const slides = document.querySelectorAll('.slide');

const prevButton = document.getElementById('prev');
const nextButton = document.getElementById('next');

let currentIndex = 0;

function changeSlide(index) {
  slides[currentIndex].classList.remove('active');
  slides[index].classList.add('active');
  currentIndex = index;
}

prevButton.addEventListener('click', () => {
  const newIndex = currentIndex === 0 ? slides.length - 1 : currentIndex - 1;
  changeSlide(newIndex);
});
nextButton.addEventListener('click', () => {
  const newIndex = currentIndex === slides.length - 1 ? 0 : currentIndex + 1;
  changeSlide(newIndex);
});

setInterval(() => {
  const newIndex = (currentIndex + 1) % slides.length;
  changeSlide(newIndex);
}, 3000);

結果: 期待される動きは、前後ボタンで画像が切り替わり、3秒ごとに次の画像へ進むことです。

サンプルコード9:カウントダウンタイマー

カウントダウンタイマーは、残り秒数を状態として持ち、一定間隔で減らして画面を更新します。時間表示ではString()padStart()を使うと、00:09のような桁揃えができます。

<p id="timer">カウントダウンタイマー:00:00</p>
<button id="start">開始</button>
<button id="stop">停止</button>

結果: 期待される表示は、残り時間のテキスト、開始ボタン、停止ボタンです。

const timerElement = document.getElementById('timer');

const startButton = document.getElementById('start');
const stopButton = document.getElementById('stop');

let timeLeft = 60; // 秒
let timerId = null;

function updateTimer() {
  const minutes = Math.floor(timeLeft / 60);
  const seconds = timeLeft % 60;
  timerElement.textContent = `カウントダウンタイマー:${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`;
}

function startTimer() {
  if (timerId) return;
  timerId = setInterval(() => {
    timeLeft--;
    updateTimer();
    if (timeLeft <= 0) {
      clearInterval(timerId);
      timerId = null;
      alert('時間切れです!');
    }
  }, 1000);
}

function stopTimer() {
  clearInterval(timerId);
  timerId = null;
}

startButton.addEventListener('click', startTimer);
stopButton.addEventListener('click', stopTimer);

結果: 期待される動きは、開始ボタンで1秒ごとに残り時間が減り、停止ボタンで更新が止まることです。

サンプルコード10:シンプルなToDoリスト

ToDoリストでは、入力欄から値を読み、新しいli要素を作り、ulへ追加します。これはDOM操作の基本形をまとめて練習できるサンプルコードです。

<input id="inputTask" type="text" placeholder="タスクを入力">
<button id="addTask">タスク追加</button>
<ul id="taskList"></ul>

結果: 期待される表示は、タスク入力欄、追加ボタン、追加先になる空のリストです。

const addTaskButton = document.getElementById('addTask');
const inputTask = document.getElementById('inputTask');
const taskList = document.getElementById('taskList');

function addTask() {
  const task = inputTask.value;
  if (!task) return;

  const listItem = document.createElement('li');
  listItem.textContent = task;
  taskList.appendChild(listItem);

  inputTask.value = '';
}

addTaskButton.addEventListener('click', addTask);

inputTask.addEventListener('keypress', function(e) {
  if (e.key === 'Enter') {
    addTask();
  }
});

結果: 期待される動きは、入力したタスクがリスト項目として追加され、追加後に入力欄が空になることです。

注意点と対処法

JavaScriptを書くときは、動けば終わりではなく、ブラウザ差、性能、メモリ、セキュリティ、非同期処理、テストまでを意識します。こうした観点を早い段階で押さえると、サンプルコードを自分のページへ移すときの失敗を減らせます。

ブラウザ互換性

新しい構文やAPIは、利用者のブラウザで同じように動くとは限りません。そのため、Can I useやMDNの互換表を確認し、必要に応じてBabelpolyfill、代替実装を選びますし、ここがポイントです。

  • optional chainingArray.prototype.at()などは対象ブラウザを確認します。
  • 古い環境を含める場合は、ビルド工程で構文変換を検討します。
  • 機能がない場合でも操作できる代替UIを残すると言えるでしょう。

パフォーマンス

画面更新が重くなる原因の多くは、不要なループや頻繁なDOM操作です。特に大量の要素を追加する場合は、DocumentFragmentを使ってまとめて挿入すると負荷を抑えやすくなります。

  • 同じ要素を何度も検索せず、取得した参照を使い回します。
  • スクロールや入力イベントでは、必要に応じてdebouncethrottleを検討するのが基本です。
  • 時間のかかる処理は非同期化し、メインスレッドを長く塞がない設計にします。

メモリリーク

不要になった要素やイベントリスナーへの参照が残ると、メモリが解放されにくくなる場合があります。動的に作った画面部品を削除する処理では、関連するremoveEventListener()やタイマー解除も確認するのが目安です。

  • setInterval()を使ったらclearInterval()で止める経路を用意します。
  • 大きな配列やオブジェクトを使い終えたら参照を残さないようにします。
  • クロージャが外側の値を保持し続ける構造に注意するのがポイントです。

セキュリティ

ユーザー入力を扱うコードでは、XSSを避ける設計が欠かせません。文字列をそのままHTMLとして解釈させるより、textContentで文字として挿入するほうが安全に扱えます。

  • eval()は通常の実装で避け、必要な処理を関数や条件分岐で表します。
  • 外部から受け取った値は、クライアント側とサーバー側の両方で検証するのが一般的です。
  • 通信ではHTTPSを使い、認証情報や個人情報の扱いを分けます。
ℹ️ 補足: ブラウザ側の入力チェックは利用者への案内として役立ちますが、改ざんを防ぐ境界にはなりません。保存や決済などの処理ではサーバー側の検証を必ず組み合わせます。

グローバル変数の過剰使用

グローバル変数が増えると、別のスクリプトと名前が衝突しやすくなるのが現実的です。基本的にletconstのブロックスコープを使い、処理を関数やモジュールへ閉じ込めます。

  • 複数ファイルへ分ける場合はtype="module"を検討します。
  • 設定値は一つのObjectにまとめ、名前の散らばりを抑えますが、これは押さえたい点です。
  • 一時的な値は関数内で完結させ、外側へ漏らさないようにします。

非同期処理の複雑さ

通信やタイマーなどの非同期処理は、書き方が増えるほど流れを追いにくくなります。Promiseasync/awaitを使うと、成功時と失敗時の処理を分けて読みやすくできると整理できます。

  • 例外処理にはtry/catchを組み合わせます。
  • 通信の失敗、タイムアウト、空データを正常系とは分けて扱います。
  • 同時に走る処理がある場合は、最後に反映すべき結果を明確にすると理解できます。

テストの不足

  • 純粋な計算関数は単体テストに分けやすくなります。
  • DOM操作を含む処理は、クリック前後の状態を確認します。
  • フォームでは正常値、空値、形式違いを分けて確認すると覚えるとよいでしょう。

まとめ

JavaScriptは、変数、条件分岐、関数を土台にして、DOM操作とイベント処理で画面の反応を作る言語です。今回のサンプルコードでは、文字色変更、画像切り替え、フォーム検証、ドラッグアンドドロップ、アコーディオン、タブ、モーダル、スライドショー、タイマー、ToDoリストを扱いました。

JavaScriptの例に共通するのは、対象要素を取得し、操作に応じて状態を変え、画面へ反映する流れです。その流れを意識すると、初心者でも別のUIへ応用しやすくなります。

ただし、実際の公開ページでは、セキュリティ、アクセシビリティ、ブラウザ互換性、エラー処理も合わせて設計します。サンプルコードを出発点にしながら、公式ドキュメントでAPIの仕様を確認し、少しずつ機能を分けて育てる進め方が堅実です。

関連記事

著者: Japanシーモア編集部

Japanシーモアは、Web/IoT/APP/SYS 分野のプログラミング情報を体系的に提供するメディアです。本記事は編集部による執筆とAI支援を組み合わせて制作し、公開前に編集部が校正しています。誤りや改善案がございましたらお問い合わせよりご連絡ください。

※本記事は実在のエンジニア複数名で構成される Japanシーモア編集部が、AI支援を活用して作成・校正・公開しています。