# 値の評価と表示
値の評価とは、入力した値を評価してその結果を返すこと。
```javascript=
>> 1 // 値
1 // 評価
>> 1 + 1 // 値
2 // 評価
```
<br/>
## ブラウザでJavaScriptを実行する
### 1. ブラウザの開発者ツールのコンソール上でJavaScriptコードを評価する方法
ブラウザなど多くの実行環境には、コードを評価してその結果を表示するREPL(read–eval–print loop)と呼ばれる開発者向けの機能があります。
* Google Chrome検証ツールのショートカット
`F12` または `⌘` + `option` + `I`
<br/>
**コンソールでの実行例**
```javascript=
» const bookTitle = "JavaScript Primer"; // 値(変数宣言)
undefined // 評価
» bookTitle // 値
"JavaScript Primer" // 評価
```
**注意点**
`const`で定義した変数に再代入するとエラーになる。
```javascript=
» const bookTitle = "JavaScript Primer";
undefined
» const bookTitle = "JavaScript Primer";
SyntaxError: redeclaration of const bookTitle // エラー
```
ページをリロードすると宣言がリセットされる。
<br/>
### 2. HTMLファイルを作成しJavaScriptを読み込む方法
HTMLファイルとJavaScriptファイルの2種類を使い、JavaScriptのコードを実行する準備をしていきます。 必ず文字コード(エンコーディング)はUTF-8、改行コードはLFにしてファイルを保存してください。
**index.js**
```javascript=
1;
```
**index.html**
```htmlmixed=
<html>
<head>
<meta charset="UTF-8">
<title>Example</title>
<script src="./index.js"></script> // JSを読み込む記述
</head>
<body></body>
</html>
```
<br/>
**ブラウザで作成したindex.htmlを開く方法**
* ブラウザにHTMLファイルをドラッグアンドドロップする
* ファイルメニューから"ファイルを開く"でHTMLファイルを選択する
* VSCodeの拡張機能(Live Server等)で開く
* ターミナルで開いている場合、pwdコマンドを使って表示されたPATHをURLに貼り付ける
<br/>
## Console API
`console.log(引数)`の引数にコンソール表示したい値を渡すことで、評価結果がコンソールに表示されます。
**index.js**
```javascript=
console.log(1); // => 1
```
<br/>
次のように引数に式を書いた場合は先に引数の式を評価してから、その結果をコンソールに表示します。 そのため、1 + 1 の評価結果として 2 がコンソールに表示されます。
**index.js**
```javascript=
console.log(1 + 1); // => 2
```
<br/>
同じように引数に変数を渡すこともできます。 この場合もまず先に引数である変数を評価してから、その結果をコンソールに表示します。
**index.js**
```javascript=
const total = 42 + 42; // 値(変数宣言)
console.log(total); // => 84
```
<br/>
Console APIは原始的なプリントデバッグとして利用できます。 「この値は何だろう」と思ったらコンソールに表示すると解決する問題は多いです。
**index.js**
```javascript=
// 式の評価結果の例(コンソールには表示されない)
1; // => 1
const total = 42 + 42;
// 変数の評価結果の例(コンソールには表示されない)
total; // => 84
// Console APIでコンソールに表示する例
console.log("JavaScript"); // => "JavaScript"
```
<br/>
## コードの評価とエラー
新しいプログラミング言語を学ぶ際にはトライアンドエラー(試行錯誤)することはとても重要です。エラーには大きく分けて構文エラーと実行時エラーの2種類があります。
<br/>
### 1. 構文エラー
構文エラーは書かれたコードの文法が間違っている場合に発生するエラーです。
JavaScriptエンジンは、コードをパース(解釈)してから、プログラムとして実行できる形に変換して実行します。 コードをパースする際に文法の問題が見つかると、その時点で構文エラーが発生するためプログラムとして実行できません。
次のコードでは、関数呼び出しに)をつけ忘れているため構文エラーが発生します。
**index.js**
```javascript=
console.log(1; // => SyntaxError: missing ) after argument list
```
<br/>
次のコードでは、`const`を`cosnt`とタイプミスしているため構文エラーが発生しています。
**index.js**
```javascript=
cosnt a = 1; // => SyntaxError: Unexpected identifier 'a'
```
なぜこのようなエラーメッセージになるかというと、`cosnt`(`const`のタイプミス)はキーワードではないため、ただの変数名として解釈されます。 そのため、このコードは次のようなコードであると解釈され、そのような文法は認められないということで構文エラーとなっています。
<br/>
### 2. 実行時エラー(ランタイムエラー)
実行時エラーが発生した場合は、そのコードは構文としては正しい(構文エラーではない)のですが、別のことが原因でエラーが発生しています。
次のコードではxという存在しない変数を参照したため、ReferenceErrorという実行時エラーが発生しています。
**index.js**
```javascript=
const value = "値";
console.log(x); // => ReferenceError: x is not defined
```
実行時エラーは該当する箇所を実行するまで、エラーになるかがわからない場合も多いです。 実行時エラーは構文エラーに比べてエラーの種類も多く、その原因もプログラムの数だけあります。
<br/>
**実行時エラーが発生した時の対処方法**
* エラーメッセージを読む
* エラーが発生した周辺をよく見る
* どこまで実行出来たか順に追う(デバッグする)
* ググる
<br/>
## まとめ
エラーがWebコンソールに表示されているならば、そのエラーは修正できます。 エラーを過度に怖がる必要はありません。エラーメッセージなどのヒントを使ってエラーを修正していけるようにしましょう。
[JavaScriptでconsole.log()を使うのはやめよう](https://qiita.com/baby-degu/items/1046763163bc794870ea)
**皆さんからもぜひ追記修正お願いします!**
---
### 使えそうなconsole.api
https://qiita.com/mtoyopet/items/7274761af5424cee342a
```javascript!
const foo = { name: "momoko", age: 29 };
const bar = { name: "takeshi", age: 34 };
const baz = { name: "saori", age: 15 };
//個数分console.logの記載をするのは面倒くさい...
console.log(foo);
console.log(bar);
console.log(baz);
❯ n sample.js
{ name: 'momoko', age: 29 }
{ name: 'takeshi', age: 34 }
{ name: 'saori', age: 15 }
```
オブジェクトに入れてあげると...
```javascript=
console.log({foo,bar,baz})
❯ n sample.js
{
foo: { name: 'momoko', age: 29 },
bar: { name: 'takeshi', age: 34 },
baz: { name: 'saori', age: 15 }
}
```
cssの適用
```javascript
console.log("%c お友達!", "color: red; font- weight:bold");
```
console.logしたいデータがとても重要で目立たせたい場合は、「"%c + 文字列", "CSSスタイル"」でCSSスタイリングを指定することも可能
オブジェクトの状態をテーブルで表示
```javascript=
console.table([foo, bar, baz]);
┌─────────┬───────────┬─────┐
│ (index) │ name │ age │
├─────────┼───────────┼─────┤
│ 0 │ 'momoko' │ 29 │
│ 1 │ 'takeshi' │ 34 │
│ 2 │ 'saori' │ 15 │
└─────────┴───────────┴─────┘
```
[console.traceによる関数のトレース](https://www.sejuku.net/blog/96123#:~:text=console.trace%E3%81%AB%E3%82%88%E3%82%8B%E9%96%A2%E6%95%B0%E3%81%AE%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B9)
```javascript=
function test1() {
function test2() {
console.trace();
}
test2();
}
test1();
//Trace
//at test2 (/Users/mh/work/front_end/react_1/sample.js:3:13)
//at test1 (/Users/mh/work/front_end/react_1/sample.js:5:3)
//at Object.<anonymous> (/Users/mh/work/front_end/react_1/sample.js:8:1)
```