式と文、if文、for文など、まとめた

## 式と文

* 文は「文と式」からなり、式は「式と演算子」からなる。
* 式は分解すると、「識別子」と「リテラル値」と「演算子」からなる
* 識別子とは、予約語、true,false以外からなる、先頭が数字ではない、英文字、数字、_、＄が続く文字

```js:js
//ｓｔｒが識別子 「=」が演算子、'hello'がリテラル値
const str = 'hello';
```

予約語の種類は

* var const let 
* if else 
* do while 
* switch case default break continue
* for in
* try catch finally throw
* new
* return
* delete
* instanceof typeof void

などの、プログラムで予め決められている語

##文とは
プログラムの実行は文をひとつずつ実行していくと考えても問題はない。
文の種類は以下の通り。

* ブロック文　
* 変数宣言文
* 関数宣言文
* 式文
* 空文(セミコロンが必要)
* 制御文（3種類）
    * **条件分岐**
    * **繰り返し**
    * **ジャンプ**

* ブロック文にはセミコロンは不要だが、式文には必要。


```js:js
let a;//変数宣言文。
let b = 1;//宣言とともに初期化する式文。

//関数宣言文
function fn() {};

//空文のブロック文
while (a >1) {
    ;
}
```

##制御文について
* if文
* switch文

#####if文

```js:js
//if文
let a = 11;
if(a > 10) console.log('hello');
else console.log('goodbye');

//表記の紛らわしさをなくすため、ブロック文を使用
if(a > 10) {
  console.log('hello');
} else {
  console.log('goodbye');
```
#####switch文：多分岐のときはswitch文のほうがわかりやすい
* 引数とcaseの値を同値比較（===）する
* 判定で同値になった箇所から下にコードを読み込んでいく
* break文で処理を抜けることで、該当する処理のみを実行する

```js:js
switch (color) {
  case red:
    console.log('red');
    break;

  case blue:
    console.log('blue');
    break;

  default:
    console.log('yellow');
    break;
}
```

####繰り返し（ループ処理）
* while文
* do while文
* for文(値の繰り返し)
* for in文、for each in文（オブジェクトの繰り返し）
* continue文とbreak文
    * continue文はループ処理をスキップして次の処理を行う
    * break文はループ処理自体を停止させる


```js:js
//while文
let i = 0;
while (i < 10) {
  console.log(i);
  i++;
}  
// 0123456789


//for文で同じ処理
for (let k = 0; k < 10; k++) {
  console.log(k);
}


//while文とdo while文の違い

//条件を見てから処理を実行
let i = 15;
while (i < 10) {
  console.log(i);
  i++;
}
//条件を満たしてないので何もでない


//処理を実行してから条件を見る
let j = 15;
do {
  console.log(j);
  j++
} while(i < 10);
//15
```

#####continue文とbreak文
```js:js
//continue文は処理をスキップする
ar i = 0;
while(i < 5){
  ++i;
  if(i < 2) continue;//２より小さい間は処理をスキップ
  console.log(i);
}
//234

//ブレイク文は処理を止める
var j = 0; 
loop: while(j < 5){
  ++j;
  if(j >= 2) break;//2以上のとき、ループ処理を停止
  console.log(j);
}
//1
```


####for in文、for each文　（オブジェクトの繰り返し）

```js:js
//for　in文 キーが取得される
const obj = {x:2, y:4};
for(key in obj) {
  console.log(key + '=' + obj[key]);
}
//"x = 2"  "y = 4"


//for each　in文　　値が取得される
const obj = {x:2, y:4};
for each(value in obj) {
  console.log(value);
}
//2 4
```


#####ラベルを使ったジャンプ
* ラベルは2重以上のループをぬけるために使われる
* Continue文やbreak文とともに使われる構文
* **識別子：処理** のように書く
* あまり使用は好まれていない


```js:js

//ラベルの基本
test: {
  console.log('hello');
  console.log('hello');
}


//ラベルのスキップ
loop: for(var i = 0; i < 10; ++i){ // 『break文』でここの処理が停止します。
    for(var j = 0; j < 10; ++j){
        break loop;
    }
}
console.log(j);
//0
```

###try catch finally文
例外のエラーが出るかもしれない処理がある場合、エラーがでたときに特定の処理を行いたいときに使う。


```js:js
//エラー処理が発生しない場合
try{
function div(a, b) {
  return a / b;
 }
}catch(e){
    alert("エラーが発生しました。");   
}finally{
    alert("エラー判定を終了します。"); //最後に必ず実行される
}
div(4, 10);
//実行結果
//"エラー判定を終了します。"




//エラー処理が発生した場合
try{
function div(a, b) {
  return a / b;
 }
}catch(e){
    alert("エラーが発生しました。");   
}finally{
    alert("エラー判定を終了します。"); 
}
let d = 10;
let result = div(c, d);
//実行結果
//"エラーが発生しました。"
//"エラー判定を終了します。"
```

#####throwを使えば例外がどのときなのかを指定してかくことができる

```js:js
function div(a, b){
    try{
        if(a==0||b==0){                
            throw "error";
        }else if(isNaN(a)||isNaN(b)){   
            throw "nan"
        }else{                         
            alert(a/b);
        }
    }catch(e){
        if(e=="zero"){                        
             alert("０で除算したため終了します。"); //A 
        }
        if(e=="nan"){                             
            alert("数値以外で除算したため終了します。"); //B  
        }
    }
}

div(4,2);   //2
div(4,0);   //Aを実行
div(4,"f"); //Bを実行
```