【もう怖くない】JavaScriptデバッグが楽しくなる!探偵ゲーム感覚でマスター
こんにちは、とまだです。
「エラーが出たけど、どこが悪いのか全然わからない...」「console.logばっかり書いてるけど、これで正解なの?」って悩んでいませんか?
わかります、その気持ち。私も最初はエラーメッセージを見ただけで「もうダメだ。こんなの理解できない」ってパニックになっていました。
でもですね、今ではエラーが出ると「お!また謎解きゲームの始まりだ!」ってワクワクするようになったんです。
今回は、そのノウハウを全部お教えします。デバッグを探偵ゲームみたいに楽しめるようになれば、プログラミングがもっと楽しくなりますよ。
そもそもデバッグとは?探偵になって謎を解こう
JavaScriptのデバッグって、難しく聞こえますよね。
でも実は、推理小説の探偵と同じようなものなんです。
探偵を想像してみてください。
- 事件現場で手がかりを集めます
- 証拠から犯人の行動を推理します
- 最後に真相にたどり着きます
JavaScriptのデバッグも同じです。
// エラーが起きたコード(事件現場)
const result = calculateTotal(items);
console.log(result); // undefined が出力される(謎の結果)
ここで、resultがundefinedになるのが「事件」。デバッグツールを使って「犯人(バグ)」を見つけるのが、私たちの仕事です。
なぜデバッグスキルが必要なのか
「エラーが出たら、とりあえず検索すればいいんじゃないの?」
そう思うかもしれません。
でも、実際の開発現場では以下のような問題があります。
検索だけに頼る場合の問題点:
- 自分のコードに特有のエラーは見つからない
- 原因が分からないまま、コピペで解決しても応用が利かない
- 同じようなエラーで何度もつまずく
- デバッグに時間がかかりすぎて、開発が進まない
デバッグスキルがあると:
- エラーの原因を自力で特定できる
- 問題解決のスピードが格段に上がる
- コードの動きを深く理解できる
- 自信を持ってコードが書けるようになる
私自身、デバッグスキルを身につけてから、エラーが怖くなくなりました。むしろ「また謎解きができる!」という気持ちになれるようになったんです。
Chrome開発者ツールの開き方と基本画面
まずは、デバッグの相棒となるChrome開発者ツールを開いてみましょう。
開発者ツールを開く3つの方法
-
右クリックから開く(一番簡単)
- ページ上で右クリック → 「検証」を選択
-
ショートカットキーで開く(慣れると最速)
- Windows:
F12またはCtrl + Shift + I - Mac:
Cmd + Option + I
- Windows:
-
メニューから開く
- Chrome右上の「︙」→「その他のツール」→「デベロッパーツール」
開発者ツールが開いたら、画面が分割されて、下か右側にツールが表示されます。
覚えておきたい3つのタブ
開発者ツールにはたくさんのタブがありますが、最初は以下の3つだけ覚えておけば大丈夫です。
1. Console(コンソール)タブ
- JavaScriptの実行結果やエラーが表示される
console.log()の出力先- 簡単なコードをその場で実行できる
2. Sources(ソース)タブ
- JavaScriptファイルの中身を確認
- ブレークポイントを設定してデバッグ
- コードの実行を一時停止して調査
3. Network(ネットワーク)タブ
- API通信の内容を確認
- 画像やファイルの読み込み状況
- 通信エラーの原因調査
最初はConsoleタブから始めるのがおすすめです。エラーメッセージもここに表示されるので、一番使う機会が多いはずです。
console.logを使った基本的なデバッグ方法
console.log()は、JavaScriptデバッグの基本中の基本です。
でも、ただ使うだけでは効果半減。効果的な使い方を見ていきましょう。
基本的な使い方
// 変数の中身を確認
const userName = "とまだ";
console.log(userName); // "とまだ" と出力
// 計算結果を確認
const total = 100 + 200;
console.log(total); // 300 と出力
コンソールに値が表示されることで、プログラムがどう動いているか確認できます。
初心者がやりがちな非効率な使い方
// ❌ 何の値か分からない
console.log(price);
console.log(quantity);
console.log(total);
// コンソールに数字だけが並んで、どれがどの値か分からない...
プロが使うconsole.logのテクニック
1. ラベルを付けて分かりやすく
console.log("価格:", price);
console.log("数量:", quantity);
console.log("合計:", total);
2. オブジェクトでまとめて表示
console.log({ price, quantity, total });
// {price: 1000, quantity: 3, total: 3000} のように表示
3. console.table()で見やすく表示
const items = [
{ name: "りんご", price: 100 },
{ name: "みかん", price: 80 },
{ name: "バナナ", price: 120 }
];
console.table(items);
// 表形式で見やすく表示される
4. console.error()とconsole.warn()の使い分け
// エラーの時(赤色で表示)
console.error("致命的なエラーが発生しました");
// 警告の時(黄色で表示)
console.warn("推奨されない使い方です");
// 通常の情報
console.log("正常に処理されました");
色分けされることで、重要度が一目で分かるようになります。
ブレークポイントで処理を止めて調査する方法
console.log()だけでは限界があります。
そこで登場するのがブレークポイントです。
ブレークポイントとは?
電車で例えると分かりやすいかもしれません。
通常、電車(プログラム)は始発駅から終着駅まで止まらずに走ります。でも、途中駅で降りて周りを見たい時もありますよね。
ブレークポイントは、その途中駅のようなものです。
ブレークポイントの設定方法
- Sourcesタブを開く
- デバッグしたいJSファイルを選択
- 止めたい行番号をクリック
function calculateTotal(items) {
let total = 0;
for (let item of items) { // ← ここの行番号をクリック
total += item.price;
}
return total;
}
青い印が付いたら、ブレークポイントの設定完了です。
ステップ実行でコードを1行ずつ確認
ブレークポイントで止まったら、以下のボタンで操作します。
- ▶️ Resume(再開): 次のブレークポイントまで実行
- ⤵️ Step Over(ステップオーバー): 現在の行を実行して次の行へ
- ⬇️ Step Into(ステップイン): 関数の中に入る
- ⬆️ Step Out(ステップアウト): 関数から出る
料理で例えると:
- Step Over = レシピを1手順ずつ進める
- Step Into = 「野菜を切る」の詳細手順に入る
- Step Out = 詳細手順から戻る
変数の中身をリアルタイムで確認
ブレークポイントで止まっている時、変数にマウスを合わせると、その時点での値が表示されます。
また、右側の「Scope」パネルでは、すべての変数の状態を確認できます。
// ブレークポイントで止まった時
let total = 0; // マウスを合わせると "0" と表示
let item = { price: 100 }; // { price: 100 } と表示
これで、「なぜ計算結果がおかしいのか」「どこで値が変わったのか」が手に取るように分かります。
よくあるエラーメッセージと解決方法
初心者が最初につまずくのが、英語のエラーメッセージです。
でも、パターンを覚えれば怖くありません。頻出エラーを日本語で解説します。
1. Uncaught ReferenceError: xxx is not defined
エラーの意味: 「xxx という変数が定義されていません」
// ❌ エラーが出るコード
console.log(userName); // userName is not defined
// ✅ 正しいコード
const userName = "とまだ";
console.log(userName);
原因と対策:
- 変数名のスペルミス → スペルを確認
- 変数を宣言する前に使った → 順番を入れ替える
- スコープ外で使おうとした → 変数の有効範囲を確認
2. Uncaught TypeError: Cannot read property 'xxx' of undefined
エラーの意味: 「undefined のプロパティ xxx を読み取れません」
// ❌ エラーが出るコード
const user = undefined;
console.log(user.name); // Cannot read property 'name' of undefined
// ✅ 正しいコード
const user = { name: "とまだ" };
console.log(user.name);
原因と対策:
- オブジェクトが存在しない → 存在確認をする
- APIからデータが返ってきていない → 通信を確認
- 配列が空 → 長さをチェックする
3. Uncaught SyntaxError: Unexpected token
エラーの意味: 「予期しない記号があります(文法エラー)」
// ❌ エラーが出るコード
const obj = {
name: "とまだ",
age: 25, // ← 最後のカンマ(古いブラウザでエラー)
};
// ❌ 括弧の対応が取れていない
if (true { // ) が足りない
console.log("エラー");
}
原因と対策:
- 括弧の数が合わない → 対応を確認
- セミコロンやカンマの位置 → 文法を再確認
- 全角スペースが混入 → 半角に置換
エラーメッセージの読み方のコツ
- エラーの種類を確認(ReferenceError、TypeError など)
- エラーメッセージの内容を読む
- ファイル名と行番号を確認(script.js:15 など)
- その行の前後も確認(原因は別の行にあることも)
エラーメッセージは「プログラムからのヒント」だと思って、落ち着いて読み解きましょう。
初心者が陥りやすい5つのデバッグの落とし穴
ここまで基本的なデバッグ方法を見てきました。
でも実際にやってみると、思わぬところでつまずくものです。私が指導してきた経験から、特に多い5つの落とし穴を紹介します。
1. console.logの消し忘れ問題
// 開発中はこんな感じに...
function processData(data) {
console.log("処理開始");
console.log(data);
const result = data.map(item => {
console.log("処理中:", item);
return item * 2;
});
console.log("結果:", result);
return result;
}
問題点:
- 本番環境でコンソールが汚れる
- パフォーマンスに影響する
- セキュリティリスク(重要な情報が表示される)
解決策:
// デバッグ用フラグを使う
const DEBUG = true; // 本番では false に
function debugLog(...args) {
if (DEBUG) {
console.log(...args);
}
}
// 使用例
debugLog("処理開始"); // DEBUG が false なら出力されない
2. 非同期処理のデバッグで混乱
console.log("1. 開始");
setTimeout(() => {
console.log("2. 1秒後"); // 最後に表示される!
}, 1000);
console.log("3. 終了");
// 出力順序: 1 → 3 → 2
なぜ混乱するのか:
- コードの順番と実行順序が異なる
- タイミングによって結果が変わる
解決策:
// async/await で分かりやすく
async function fetchData() {
console.log("1. データ取得開始");
try {
const data = await fetch('/api/data');
console.log("2. データ取得成功");
return data;
} catch (error) {
console.error("エラー発生:", error);
}
}
3. 変数の巻き上げ(ホイスティング)による謎エラー
console.log(message); // undefined(エラーにならない!)
var message = "こんにちは";
// let や const の場合
console.log(greeting); // ReferenceError(エラーになる)
let greeting = "Hello";
対策:
varは使わず、letかconstを使う- 変数は使う前に必ず宣言する
4. this の指す先が分からない
const obj = {
name: "とまだ",
greet: function() {
console.log("こんにちは、" + this.name);
setTimeout(function() {
console.log(this.name); // undefined!
}, 1000);
}
};
解決策:
const obj = {
name: "とまだ",
greet: function() {
console.log("こんにちは、" + this.name);
// アロー関数を使う
setTimeout(() => {
console.log(this.name); // "とまだ" が表示される
}, 1000);
}
};
5. デバッグコードに頼りすぎて本質を見失う
// デバッグのためにコードが複雑に...
function complexFunction(data) {
console.log("Step 1");
const temp1 = processStep1(data);
console.log("temp1:", temp1);
console.log("Step 2");
const temp2 = processStep2(temp1);
console.log("temp2:", temp2);
// もはや何をしている関数か分からない...
}
より良いアプローチ:
- まず処理の流れを理解する
- 怪しい箇所に絞ってデバッグ
- デバッグ後はコードをきれいに
デバッグは「手段」であって「目的」ではありません。コードを理解することが本当の目的です。
Learning NextでJavaScriptの基礎から実践まで体系的に学ぼう
ここまでデバッグの基本を解説してきました。
でも、「そもそもJavaScriptの基礎がまだ不安...」「もっと体系的に学びたい」という方も多いのではないでしょうか。
私が運営しているLearning Nextでは、JavaScriptを基礎から実践まで、挫折しないように設計されたカリキュラムを提供しています。
なぜLearning Nextがおすすめなのか
1. デバッグスキルも含めた実践的な内容
- エラー処理の章で、今回紹介したデバッグ手法を詳しく解説
- 実際のエラーに遭遇しながら、解決方法を身につける
2. 豊富な練習問題で定着
- 各章に練習問題を用意
- 実際にデバッグが必要な問題も含まれる
- 間違えやすいポイントを事前に学習
3. 初心者でも挫折しない設計
- プログラミングスクール講師としての経験を活かした構成
- つまずきやすいポイントを丁寧に解説
- 段階的に難易度が上がる設計
JavaScriptカリキュラムの内容
- JavaScript開発環境の構築
- JavaScriptの基本文法
- 制御構造(if文、ループなど)
- 関数(アロー関数も含む)
- エラー処理とデバッグ(今回の内容をさらに詳しく)
- DOM操作とイベント
- 非同期処理の基礎
- APIとの通信
- 実践プロジェクト(Todoアプリ、おみくじアプリ)
特に「エラー処理とデバッグ」の章では、実際のプロジェクトで遭遇するエラーパターンを網羅しています。
月額約2,000円で、JavaScriptだけでなくTypeScriptやReactなど、関連する技術も学び放題です。まずは無料で内容を確認してみてください。
まとめ:デバッグマスターでJavaScriptがもっと楽しくなった!
お疲れさまでした!
いかがでしたか?デバッグに対するイメージが変わったでしょうか。
私がプログラミングスクールで教えていた時、最初はエラーで泣きそうになっていた生徒さんが、3ヶ月後には「エラーが出ると探偵ゲームみたいで楽しいです」って言うようになったんです。その変化を見ていて、本当に嬉しかったのを覚えています。
今日から実践できること:
- F12でデベロッパーツールを開く(最初の一歩)
- console.log()に説明をつける(何のログかわかるように)
- ブレークポイントで一時停止(一歩ずつ確認)
- エラーメッセージをよく読む(情報の宝庫)
- わからない時は素直に検索(息抱は無用)
デバッグスキルを身につけると、エラーが出た時に「やったー!これでまた成長できる!」って思えるようになります。本当に、プログラミングが100倍楽しくなりますよ。
エラーを怖がらず、どんどん新しいことに挑戦していきましょう!
著者について

とまだ
フルスタックエンジニア
Learning Next の創設者。Ruby on Rails と React を中心に、プログラミング教育に情熱を注いでいます。初心者が楽しく学べる環境作りを目指しています。
著者の詳細を見る →