今すぐJavaScriptデバッグ効率を上げるconsoleテクニック

>こちらの記事は、2019年9月に公開された[Indrek Lasn](https://medium.com/@indreklasn)氏による『[Boost your JavaScript Debugging Skills With These Console Tricks](https://medium.com/better-programming/boost-your-javascript-debugging-skills-with-these-console-tricks-ab984c70298a)』の和訳になります。
本記事は原著者から許可を得た上で記事を公開しています。
著者Twitter https://twitter.com/lasnindrek



JavaScriptにはコードをデバッグするためのツールがたくさんあります。

JavaScriptコードをデバッグするお決まりの方法といえば、コンソールから結果を出力するだけの`console.log`メソッドを使うことでしょう。 十分に機能はしますが、デバッグに最適とまでは言えません。これよりもっと良い方法があれば、試してみたいと思いませんか？

![](https://miro.medium.com/max/1106/1*qt_h2Zv7RpGy10diUIFYdQ.png)

`console`オブジェクトを使えば、ブラウザのデバッグコンソールへのアクセスすることができます。`console`オブジェクトを使用できるのは、ブラウザで（サーバー側ではなく、クライアント側の）JavaScriptコードを実行する場合に限ります。

動作の仕組みはブラウザによって異なりますが、一般的に提供されているデファクトの機能セットがあります。consoleのデバッグステートメントの最も優れた部分は、言語のコア機能に組み込まれているため、すべてのライブラリとフレームワークで動作することです。

console.logの最も基本的な使い方は、コードの出力表示です。具体的には次のコードを見てください：

```js
function sayHello(name) {
  console.log(name)
}

sayHello('Indrek')
```

このコードは`sayHello`関数に渡された名前をコンソールに出力します。

![](https://miro.medium.com/max/1110/1*BtS8K5C8hv7GIuzVmRjxtQ.png)

もし`sayHello`関数が何回呼び出されたか知りたい場合どうしたらよいでしょう？これは、`console.count()`を使えば簡単に調べることができます。

# console.count
`count()`は、その引数をラベルとして、呼び出した回数を出力します。引数がない場合、`count()`はデフォルトのラベルを使用します。

```js
function sayHello(name) {
  console.count()
  console.log(name)
}

sayHello("Indrek")
sayHello("William")
sayHello("Kelly") 
```

上記のコードは次のように出力します：

![](https://miro.medium.com/max/1104/1*gKFq-qNc4H2vpe3pxeAj0g.png)

このメソッドを使えば、関数を呼び出した回数をカウントできますが、もし、同じ名前を引数として渡した関数を呼び出した回数をカウントしたい場合はどのようにすればよいのでしょうか？これは、単に`name`引数を`count`メソッドに渡すだけで可能です。

```js
function sayHello(name) {
  console.count(name)
}

sayHello("Indrek")
sayHello("William")
sayHello("Kelly")
sayHello("Indrek")
```

ほら、これでそれぞれの名前で関数を呼び出した回数を追跡できるようになりましたね。

![](https://miro.medium.com/max/1084/1*PcN-y-Xr8EtfXV4OSaHXQQ.png)

#console.warn
`console.warn`メソッドは、コンソールに警告メッセージを出力します。このメソッドは、引数が足りていなかったり、API/パッケージのバージョンが非推奨であることを開発者に知らせるなど、何かが正しくない可能性があることをユーザーに知らせるのに最適です。

```js
function sayHello(name) {
  if(!name) {
    console.warn("No name given")
  }
}

sayHello()
```

上記のコードは、name引数が関数に渡されたかどうかをチェックします。nameが渡されなかった場合は、そのことを考慮するように促す警告メッセージをログに出力します。

![](https://miro.medium.com/max/1080/1*PqgPc5sGWnpZcp7wYal9oA.png)

#console.table
配列やオブジェクトの表示には`console.table`が便利です。配列の各要素は、テーブルの行となります。果物の名前の配列を例に見てみましょう。 fruits配列を`console.table`メソッドに渡すと、テーブルがコンソールに出力されます。

```js
const fruits = ["kiwi", "banana", "strawberry"]

console.table(fruits)
```

コンソールを見ると、この配列を説明したテーブルが表示されます。

![](https://miro.medium.com/max/1410/1*XDZCXQyYI9Dz74VVg4nHEw.png)

数千とは言わないまでも、数百もの値を持つ巨大な配列を扱うようになると、このメソッドがどれだけ便利なものになるか想像できますよね。 より理解を深めるために、先程の例よりもっとたくさんの値を配列が持っている場合の例を示します。

```js
const fruits = [
  "Apple",
  "Watermelon",
  "Orange",
  "Pear",
  "Cherry",
  "Strawberry",
  "Nectarine",
  "Grape",
  "Mango",
  "Blueberry",
  "Pomegranate",
  "Carambola",
  "Plum",
  "Banana",
  "Raspberry",
  "Mandarin",
  "Jackfruit",
  "Papaya",
  "Kiwi",
  "Pineapple",
  "Lime",
  "Lemon",
  "Apricot",
  "Grapefruit",
  "Melon",
  "Coconut",
  "Avocado",
  "Peach"
];

console.table(fruits);
```

`console.table`にこの配列を渡して実行すると、次のテーブルが表示されます。

![](https://miro.medium.com/max/1398/1*YxnP_WIRvgM5-vhtHjcrFA.png)

このように、配列の扱いは簡単ですが、では、オブジェクトだとどうでしょうか？

```js
const pets = {
  name: "Simon",
  type: "cat"
};

console.table(pets);
```

配列の代わりにオブジェクトを渡してみましょう。このオブジェクトには、ペットの`name`と`type`の2つのキーがあります。

![](https://miro.medium.com/max/1400/1*CpNhVxYbMCTLNcaRqQENvA.png)

配列の時のように値を表示する代わりに、テーブルにキーと値が表示されます。もう1つオブジェクトがあって、それを`table`で表示するには、どうすれば良いでしょうか？

```js
const pets = {
  name: "Simon",
  type: "cat"
};

const person = {
  firstName: "Indrek",
  lastName: "Lasn"
}

console.table(pets, person);
```

予想どおり、2つの異なる表にそれぞれのオブジェクトが表示されました。

![](https://miro.medium.com/max/1116/1*gNMdm6hIJ2yk7227E8Jlig.png)

これらを1つの表にまとめる場合、2つのオブジェクトを配列に格納します。

```js
const pets = {
  name: "Simon",
  type: "cat"
};

const person = {
  firstName: "Indrek",
  lastName: "Lasn"
}

console.table([pets, person]);
```

そうすると次のように、オブジェクトを1つの表にグループ化することができます。

![](https://miro.medium.com/max/1508/1*S_slbcU6aMxQqPY5mvAQ7Q.png)

#console.group
まとまりのあるデータやそれぞれが関連したデータを操作するときは、ネストの深さでデータを視覚的に関連付けることで、出力を整理することができます。 ネストブロックを作成するには、`console.group`を使います。

```js
console.log("This is the first level");
console.group();
console.log("Level 2");
console.group();
console.log("Level 3");
console.warn("More of level 3");
console.groupEnd();
console.log("Back to level 2");
console.groupEnd();
console.log("Back to the first level");
```

このコードでは、ネストの深さによってまとめられたブロックのコンソールステートメントを表示します。

![](https://miro.medium.com/max/1542/1*1f5x7-10QjlFUkMhx2kH8A.png)

似たようなふるまいをするメソッドに`console.groupCollapsed()`がありますが、このメソッドによって作成されたブロックは折りたたまれているため、メッセージを読むにはボタンをクリックしてブロックを開かなければなりません。

# まとめ
言語が提供する、すべてのツールを使ってみましょう。使う意味があるものは、使いましょう。
  
ここで、`debugger`だけでひと記事分になってしまうため、この記事では`debugger`を省略したことを言い添えておきます。`debugger`に興味がある方は、[こちらの記事](https://medium.com/better-programming/how-to-find-bugs-in-your-code-with-the-debugger-a7f739ea98)を参照してみてください。

JavaScript初学者の方は、本を読むことから始めて、何か作ってみることをお勧めします。 例えば、"[A Smarter Way to Learn JavaScript](https://www.amazon.com/Smarter-Way-Learn-JavaScript-technology-ebook/dp/B00H1W9I6C/ref=as_li_ss_tl?keywords=javascript&qid=1564573678&s=gateway&sr=8-2&linkCode=sl1&tag=thegeniusde07-20&linkId=5acbe5c31239ae23b8119d9247c6c5ad&language=en_US)"という本と"[Here’s a List of Fun Apps to Build!](https://medium.com/better-programming/the-secret-to-being-a-top-developer-is-building-things-heres-a-list-of-fun-apps-to-build-aac61ac0736c)"がおすすめです。

読んでくれてありがとう。がんばって！

# 翻訳協力　
Original Author:  **[Indrek Lasn](https://medium.com/@indreklasn)** 
Thank you for letting us share your knowledge! 

この記事は以下の方々のご協力により公開する事が出来ました。
改めて感謝致します。
選定担当:  yumika tomita
翻訳担当:  [uraway](https://twitter.com/uraway_)
監査担当:  @nyorochan
公開担当:  @aoharu