【Javascript】Consoleやdebuggerを使った開発支援

他にも競合記事が多そうですが！
社内で JavaScript を書いている時に、どのようにデバッグしたら良いかという質問があり記事にしました！

以下、サンプルは Vue にて表示しているが、基本的に JS 系列ならすべて同じ。

----

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

:::note info
【Console 画面】
「F12」や右上の「... > その他のツール > デベロッパーツール」画面にて
「Console」タブを選択した際に閲覧できる場所。
ブラウザのターミナル。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833190/a5bf35c3-9319-b8a6-aa72-9dc482e8647d.png)

Show console drawer を ON にすると、いつでも友達になれて便利。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833190/843c063e-e762-5c7d-d442-f71e5b5c8ed8.png)
:::

## ⭕ Console.log

一番有名なやつ  
引数内の要素を Console 画面へ表示してくれます。

### ただ単に表示

```js
console.log('hello')
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833190/47671bc2-5f79-610c-416f-1118821bc18d.png)

### 配列やオブジェクトも

引数は、配列でもオブジェクトでも何でも入る。
また複数突っ込むこともできる。

```js
const numArray = [1, 2, 3, 4, 5]
const map = new Map()
map.set('key', 'vaue')

console.log(numArray, map)
```

Console 画面では、`▶` が表示され、折り畳みができる。死ぬほど便利。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833190/f2434e2e-4ebf-d9cc-dc11-a1c4acb63bda.png)

### JSON化するものあり

たまに表示されないオブジェクトは、JSON化して表示すると良い。
この形式なら他へのコピーも簡単。

```js
const numArray = [1, 2, 3, 4, 5]
console.log(JSON.stringify(numArray, null, 2))
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833190/b96045a7-42e8-5695-2134-315508adf62c.png)

※ちなみに、要素を右クリックすると表示されるメニューから、JSON取得ができたりもする。
適材適所。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833190/1a8afc4f-866b-a87f-a9ce-0250ff273a92.png)

### console.dir という親戚

親戚に `console.dir` というものがあり、オプションや隠された関数も含めて全部表示する機能があります。
でも chrome だとそこまで差が無いかも...
log で困った時に使ってみると良い。

```js
const numArray = [1, 2, 3, 4, 5]

console.log(numArray)
console.dir(numArray)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833190/c26fd51c-3cba-1099-5fc2-8e83567a4003.png)


### console.trace という神

他にも warn や info など、ログに使えそうな親戚が多いですが、こいつは必要！
実行された場所のスタックトレースが表示されます！
デバッグ時に、どこから呼ばれたかを確認するのに便利...

```js
console.trace('test')
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833190/9ae452f1-4310-e342-4360-ff8d504fd86a.png)


### console.log のデコレーション

:mag: 「console.log　CSS　装飾」




## console.table

引数の要素をテーブルにして表示してくれるすごいやつ。
忘れられがちだが、俯瞰したいときにとても便利。

```js
const users = [
  { id: 10, name: 'Aさん', age: 20 },
  { id: 20, name: 'Bさん', age: 33 },
  { id: 30, name: 'Cさん', age: 26 },
]

console.table(users)
```

テーブルのおまけに、下に console.log 時の表示もしてくれる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833190/176344bf-abe9-ce43-43f0-992695f8a20f.png)




## console.time

なんと時間も測れます。
`new Date().getTime() - date.getTime()` とかやってませんか？？  

引数の文字がタイマーを区別する文字になります。

- `console.time()` : タイマースタート
- `console.timeLog()` : 今の時間を表示
- `console.timeEnd()` : タイマーを止めて、今の時間を表示

```js
console.time('a_timer')
setTimeout(() => {
  console.timeLog('a_timer')

  setTimeout(() => {
    console.timeEnd('a_timer')
  }, 1000)
}, 1000)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833190/c2558810-b36d-29c3-1c60-08287974feff.png)

（setTimeoutはそんなに正確ではないのです！）



### console.count

最後に！回数もカウントできるんですよ～。
ループ処理などで、何回通ったかを確認する際に良いと思います。

- `console.count()` : カウントして、今のカウントを表示
- `console.countReset()` : カウントをクリアする

```js
for (let i = 0; i < 10; i++) {
  console.count('a_count')
}
console.countReset('a_count')
console.count('a_count')
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833190/3ab61746-da93-4f30-3582-afabd04503a5.png)




## ⭕ debugger

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

これはJSにおいて、ブレークポイントを追加するすごいやつです。
dev 画面を使い慣れている人だと、Source 画面で付与する人もいると思いますが、消し忘れたり以外と不便なんですよね...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833190/eff4b564-59c1-e192-f828-6afe66bbff5c.png)

この機能は、止めたい箇所に `debugger` と書くだけで機能します。

```js
let test = ''

for (let i = 0; i < 5; i++) {
  debugger
  test += 'あ'
}

console.log(test)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833190/5917b771-0505-5f35-9a11-f21eb48c456a.png)

`▶` が次の debugger、ブレークポイントまで実行する。
`→` が、次の一行を実行する、です。（ステップ実行）

基本的には怪しい箇所に debugger を書いて、ステップ実行して、変数の状態や処理の順番を確認します。

例えば上の例で、`▶` を2回押すとこうなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3833190/27584b04-6796-65f4-2a5a-61af035efd48.png)

ちゃんと変数の状態が分かるんですね...つよつよ機能なのでぜひお忘れなく！  

他にも良い点があって、この debugger、「dev tools」を表示していない場合は無視されます。
消し忘れても安心！（ダメ）



## おわりに

とりあえず `console.log` と `debugger` が使えたら困りません！！！

Vue でデバッグするなら `Vue.js devtools` 一択。

https://chromewebstore.google.com/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd?hl=ja