Tips
console.log地獄から抜け出す方法
2025-10-08
結論:ブレークポイントを使え
console.logを大量に仕込む → どれがどこの出力かわからなくなる → さらに追加 → 地獄
ブレークポイントを1つ置けば、その場で全ての変数が見える。
console.logが向いているケース
| 状況 | 向き |
|---|---|
| 「この変数の値だけ確認したい」 | ✓ console.log |
| 「処理がどこまで進んだか追いたい」 | ✗ ブレークポイント |
| 「なぜこの値になったか調べたい」 | ✗ ブレークポイント |
1箇所だけならconsole.log。流れを追うならブレークポイント。
ブレークポイントの使い方
- DevTools → Sourcesタブ
- 止めたい行の行番号をクリック
- ページを操作して、その処理を通る
- 処理がそこで止まる
止まったら、右側のScopeパネルで全ての変数の値が見える。
操作ボタン
| ボタン | 動作 |
|---|---|
| ▶️ | 次のブレークポイントまで進む |
| ⤵️ Step Over | 1行進む |
| ⬇️ Step Into | 関数の中に入る |
| ⬆️ Step Out | 関数を抜ける |
私がやらかした失敗
APIから取得したデータが「なぜかundefined」になる問題。
console.logを20箇所に仕込んで、出力を眺めて、また追加して…1時間溶かした。
結局、ブレークポイントを1つ置いて5分で解決。非同期処理のawait忘れだった。
// ❌ awaitがない
const data = fetchUser(); // Promiseオブジェクトが入る
// ✓
const data = await fetchUser();
ブレークポイントで止めたら、dataにPromise {<pending>}と表示されていた。console.logでは[object Promise]としか出ず、気づけなかった。
console.logを使うなら効率的に
変数名を一緒に出す
// ❌ 何の値かわからない
console.log(user);
// ✓ 変数名がわかる
console.log({ user });
// → { user: { name: "田中", age: 30 } }
波括弧で囲むだけ。
複数の値をまとめて出す
console.log({ name, age, email });
// → { name: "田中", age: 30, email: "..." }
条件付きブレークポイント
「1000回ループの500回目だけ止めたい」
- 行番号を右クリック
- 「Add conditional breakpoint」
i === 500と入力
条件を満たしたときだけ止まる。
debuggerステートメント
コードに直接書くと、DevToolsが開いていれば止まる。
function calculate(items) {
debugger; // ここで止まる
return items.reduce((sum, item) => sum + item.price, 0);
}
**本番コードに残さないこと。**ESLintのno-debuggerルールを有効に。
エラーの読み方
Uncaught TypeError: Cannot read property 'name' of undefined
at getUserName (app.js:15)
at handleClick (app.js:8)
「undefined」に「.name」でアクセスしようとした。場所はapp.jsの15行目。
スタックトレースは下から上に読む。下が最初の呼び出し、上がエラー発生箇所。
まとめ
- 1箇所確認ならconsole.log、流れを追うならブレークポイント
- ブレークポイントなら全変数が一度に見える
console.log({ 変数名 })で変数名も出力- 本番に
debuggerを残さない - スタックトレースは下から上