JavaScriptのデバッグにはdebugger文を使おう

JavaScript初心者のため、デバッグ力がまだまだ拙くどうしたらデバッグ力ってつくのだ…と悩んでいたら

👨‍💻 < スタックトレースするといいよ！
👨‍💻 < スタックトレースするには`debugger`とか`console.trace()`使うといいよ！

と教えていただきdebuggerを使ったらとても便利だったので🙏

### スタックトレースとは
> スタックトレース (stack trace)とは
> 
> エラーが発生したときに表示される内容で、そのエラーが発生するまでの過程（どんな処理がどの順番で呼び出されたかの流れ）を、ざっくりと表示したものです。
> 
> [「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word13281.html)

### スタックトレースを使って問題をどう切り分けるか
まずは問題が起きている箇所のスコープを狭くしていきましょう💡

問題の切り分け方として
- ざっくり入口と出口の関数に適切な値が入っているのか
- 外れ値の場合はどうか
- 意図していない値が入ったときはどうか

というあたりをつけて、各々の変数に入っている値を確認していきます

### 値を確認するときにdebuggerを使う
`debugger`を仕込むと、いわゆるブレークポイントの設定のようなものが使用できます。
> debugger 文は、ブレークポイントの設定のような任意の利用可能なデバッグ機能を呼び出します。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/debugger

### debuggerの使い方
debuggerは開発者ツールのconsoleタブで気軽に使うことができます。（もちろん、普段書いているコードの途中に仕込んでもOK）

以下の関数をconsoleタブで実行します。

```javascript
function potentiallyBuggyCode() {
  let hoge = 'start'
  debugger;

  hoge = 'end'
  debugger;
}

potentiallyBuggyCode()
```

すると、Sourcesタブが立ち上がりdebuggerの部分で処理が停止していることがわかります👏
![スクリーンショット 2022-05-28 16.36.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305196/4238a8aa-d1d5-d14d-4bea-1a8ee9ab4ea4.png)


この状態でConsoleタブで変数名を入力すれば、その時点の変数の中身を返してくれます。
![スクリーンショット 2022-05-28 16.38.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305196/dc810743-9d47-1139-454f-6b37437650bc.png)


また、右上の左矢印ボタンを押すと、2番目に仕込んだdebbugerの値が確認できます。
![スクリーンショット 2022-06-03 8.44.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305196/67404b21-192a-e1b3-6ee4-bfa481dc216f.png)


## おまけ
### console.trace()で処理を追う
>console オブジェクトはスタックトレースの出力にも対応しています。これは console.trace() を呼び出した場所へ至るための呼び出し経路を表示するものです。

メソッドの呼び出された経路をConsoleに出力ができます。
呼び出し順がわからなかった時などに設置して処理を追っていきます。
```js
function funcHoge(){
  console.trace();
}

function funcFuga(){
  funcHoge();
}

funcFuga();
```
![スクリーンショット 2022-06-03 9.00.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305196/8df02f1f-5fd4-74c4-9270-b307f6fa0a3d.png)


https://developer.mozilla.org/ja/docs/Web/API/console/trace


### console.dir()でオブジェクトの出力を行う
Nuxt.jsなどFWを使っていてデバッグをする際、APIから取ってきた値などが階層が深く`[Object]`という文字になっていて中身見れないんだが？？という時によく使っています。

使い方としては、console.logのように書くだけで、.logのところを.dirに変えるだけです。
```js
const obj = {
  data: {
    id : 100,
    item: {
      foo: 200,
      bar: {
        hoge: 'hoge',
    	huga: {
    	  aaaaa: 1000
    	}
      }
    }
  }
};
console.dir(obj)
```
![スクリーンショット 2022-06-03 9.11.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305196/19fd76ba-b606-4693-2473-f257d8673c2e.png)

https://developer.mozilla.org/ja/docs/Web/API/console/dir

### console.log の第一引数に %Oを含めてconsole.dirと同等の使い方をする
console.log の第一引数に %Oを含めると同等の使い方ができるよ！と教えていただきました！ありがとうございます😊

> 1. If specifier is %o, optionally let converted be current with optimally useful formatting applied.
>
> 2. If specifier is %O, optionally let converted be current with generic > JavaScript object formatting applied.

https://console.spec.whatwg.org/#formatter

Consoleタブで実行してみると、console.dirと同じ動きをしていました！
こちらも大変便利ですね！🙌

![スクリーンショット 2022-06-03 19.51.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305196/1059ea43-141c-b192-fc01-a70767bc7f5b.png)


## まとめ
JavaScriptのデバッグ方法についてご紹介しました。
デバッグ力を高めていくことは重要なので、便利な機能はどんどん使っていきましょう！🙌