jsの自分用記録2017-01-30

# for文とwhile文の違い

for文とwhile文の違いはwhile文は真偽値の値がtrueの場合のみ処理の反復を繰り返すのに対して、for文の特徴は指定された回数の分だけ反復処理をすることです。

# for / for-in / for-of

for文には主に三つの種類があります。それぞれの特徴は、for文は配列に対して反復をするのに対して、for-onはオブジェクトに対して反復処理をすることができるという特徴があります。

### for文の構文
```js

for (初期化式; ループ条件式; 増減式){

ループ内で実行する命令

}
```

### 実装例

```js

for (var x = 1; x < 10; x++){

console.log('xの値は' + x + 'です');

};
```

例えば、上記のコードをwhile文で表現しようとすると、while文の引数に増減式を書くこともできませんしｍ初期化式を書くこともできませんから、少し複雑なコードになりがちのところ、for文の場合はfor文の引数に初期化式と直接増減式を書くことができるので直接の処理をシンプルに表現できます。

### for文をwhile文に書き換えたい

```js

var x = 1;

while (x < 10) {

console.log('xの値は' + x + 'です');

var x = x + 1;

};

```

for文の初期化式はカウンター変数ともいわれていて、ループの回数を管理する変数のことです。また、条件式は x++ だけではなく　x += 2 とかでも大丈夫です。また、下記のようなfor文も書くことができます。これは、すべてを省略したfor文の形で、無限ループします

```js

for (;;){

console.log('永遠にループし続けます')

};

```

# for文でカンマ演算子

カンマ演算子を使うと、for文の中で初期化式、増減式を複数指定することができます。好みにもよりますが、書き方次第では、コードをシンプルに表現することができます。ただし、乱用するべきではありません。

```js

for (x = 1, y = 10; x < y; x++ , y--){

console.log(x + '←インクリメント' + y + '←デクリメント')

};

```

# for-in

連想配列の要素を順番に処理できるのがfor-inです。for-inでは、与えられた連想配列の要素を取り出して先頭から順番に処理します。

### for-in文の構文

```js

for (仮変数 in 連想配列){

}
```

### for-in文の手順

まずは、左辺に仮変数を定義して右辺に連想配列を代入した変数を入れます。そうするとfor-in文がくるくるするとき、右辺に定義された連想配列が代入された変数から、キーの部分が左辺の仮変数に代入された状態になります。なので、もし、この仮変数をログとしてだした場合、連想配列のオブジェクトのキーが出力されることになるので、これは値そのものではありません。もし、値をしゅつりょくした場合は、連想配列を代入した変数を書いて、その右側に中括弧でキーを代入している仮変数を入れます。そうすることによって、仮変数に代入されているキーの値を出すことができます。

```js

var hogeobject = {hoge:10 , piyo:200};

for(piyo in hogeobject){

//puiyoにobjectkeyのキーが代入されます。

console.log(piyo + '=' + hogeobject[piyo])

};

```

# 配列の長さを計りたい

```js

var gege = ['a', 'b', 'c'];


for (var d = 0; d < gege.length ; d++){

console.log(gege)


};

```

配列はインデックス番号が定義されているので、順番にひとつづ値をだしたければ、配列の値[番号]でやらなければいけないのね。


### 動かない
```js

var hairetu =['london', 'Japan', 'NewYork']

for (var indexnumber = 0,  var value = hairetu.lenght ; indexnumber > value; indexnumber++ ){

console.log(hairetu[ indexnumber])

};

```

### なぜ動かない

```js



var date = ['london', 'Japan', 'NewYork'];

for (var i = 0,  len = date.lenght; i < len; i++) {

console.log(date[i]);

};

```

### 動いた


本当にシンタックスエラーはには気を付けて、ミスする前に、気を付けないと、見つけるの大変だから気を付けて書こう

```js

var data = ['london', 'Japan', 'NewYork'];

for (var i = 0, len = data.length; i < len; i++) {

console.log(data[i]);

};

```





# 配列などを順番に処理するfor - of

配列などを順番に列挙するにはfor文で、lengthで配列の数を取得して、値[取得した番号]で出力することができましたが、そのほかにもES2015で新しく追加された　for-ofでも処理することが可能です。fo-ofでは拝呈だけではなく、Arrayライクなオブジェクトも処理できるため、列挙可能なオブジェクトともいわれています。

### for - of の構文

```js

for(仮変数 of 列挙可能なオブジェクト){

ループ内で実装する命令

};

```

### Array.prititype.push()

push()メソッドはハイツの末尾にひとつ要素を追加することができます。また返り値にも新し要素を追加することができます。ちなみに、array.pisu(追加した値)をログに出すと、配列の数が出ますが、これはpush()はlengthに依存してるたｍです

```js

var hogePush = ['red', 'pink', 'green'];

var piyopush = hogePush.push('blue', 'whight');

console.log(hogePush);

console.log(piyopush);

```

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/push

```
push はジェネリックメソッドとして用意されています。
そのため call() や apply() と一緒にオブジェクトに対して
利用することもできます。
なお、push は配列の末尾から要素を挿入する必要性があるため、
length プロパティに依存しています。
length が数値に変換できない場合、
0 が用いられます。
また、 length が存在しない場合は 
ength も作成されることになります。

ネイティブのみで、
配列のようなオブジェクトは strings ですが、
文字列は変化しないので、
このメソッドの効果を受けるには相応しくありません。
```


# break / continue 文

変数aが10よりも小さくて、なおかつ変数ｂが100よりも小さい場合に処理を繰り返す。

```js
var result = 0;

for (var i = 1; i <= 100; i++){

	result += i;

	if (result > 1000) {break;}
}

console.log('100を超える回数は' + i);
```

### 偶数のときだけループから抜けたい

```js

for (var kisuu = 0; kisuu < 100; kisuu++){

if (kisuu % 2 === 0) { continue; }

console.log(kisuu);

};

```

# label / label構文


意図したとおりに出ない

```js

for (var i = 1; i < 10; i++){

	for(var j = 1; j < 10; j++){

		var k = i * j

		if(k > 30){break;}

		document.write(k + '&nbsp');

	}
} document.write('<br />');

```

# 旦ループは疲れたので次に行く(今度復習する感じで)


# 例外処理

例外処理とは、try...catch...fainallyです。普通のプログラムを組む過程でミスを蜜kr津琴葉できるかもしれないけど、予期しない引数が入力された、とかだとプログラム側からカバーするのは難しいので、例外処理を書く。

```js
 try {
  
 例外が発生するかもしれない命令

}catch(例外情報を受け取る変数){

例外が発生したときに実行される命令

}finally{

例外の有無にかかわらず最終的に実される命令

};
```

# 実際の実装例

```js

try{

	var reigai = reigai + jkkkk;

}catch(err){

console.log(err.message);

}finally{

	console.log('処理は終了しました');
};

```

# 例外処理はオーバーヘッドが大きい

例外処理は、確実に動くスクリプトを作るために必須の実装ではありますが、オーバーヘッドが大きいです。for文の中で使うべきではないです。ループ分の外側で例外処理が書けないかと考えるべきです

# throw と throw new Error()の違いってなんでしょうか？

JavaScript で throw "" ではなく throw new Error() を使ったほうがよい(些細な)理由
http://uupaa.hatenablog.com/entry/2014/03/12/050707



例外をつくるためには　throw文を作ります。また、throw 文は throw キーワードと式の間に行末を置くことができるため、自動セミコロン挿入 (ASI) の影響を受けます。


```js
throw "error"; //文字列である例外を生成します

throw 42; //値42である例外を発生させます

throw true; // 値trueの例外を発生させます
```

例外を投げると、オブジェクトを指定することができます。
catchブロックの中でそのオブジェクトを参照することができます。
次の例は、userException型のオブジェクトを生成して、それをthrow文の中で使っています・

# 意図的にエラーを作る

意図的にエラーを作ることの手順は、まずは、変数を二つ用意します。xには1を代入した変数で、yには0を代入した変数でした。そして、if文の中で、ｙが0だったらthrowさせるというコードをかきました

`if(y === 0){throw new Error ('errrrrr')}`それで、その下で、実際にxとyを割り算させます。当然結果は0ですから、Errorとなってcatchに渡されます。catchではeという関数にさきほどのエラー内容が渡されます。それにconsole.logでErrorのmessage関数をつかって、ログを出力します


```js

var x = 1;
var y = 0;

try{

	if (y === 0) { throw new Error ('0で除算しようとしました');}
	var z = x / y;
}catch(e){

console.log(e.message);

}

```

# オブジェクトを利用するための準備　new演算子

オブジェクトというのは、自分自身がデータを保持するもの。一つのオブジェクトに対して複数のアプリからデータを書きこめてしまったら不整合が起こります。そこで、オリジナルのオブジェクトには手を加えずに、それを複製したものに手を加えるのです。オリジナルを複製したコピーを操作することでデータの競合を防ぐ仕組みになっています。その、オブジェクトを複製することをインスタンス化、複製されたオブジェクトをインスタンスと言います。インスタンス化するというのは、オブジェクトを自分専用領域を確保するということと言えるかもしれません

```js
var 変数名　= new オブジェクト名([引数])
```

# オブジェクトのインスタンス化までの手順

オブジェクトを作る

オブジェクトをインスタンス化する

インスタンス化されたオブジェクトはインスタンスとなる

オブジェクトをインスタンス化するとき、オブジェクトを初期化するとき、

あらかじめオブジェクトと同名のメソッドがあるんです

それが、コンストラクターと呼ばれています

そして、生成されたオブジェクトは変数に代入されます

オブジェクトが代入された変数はインスタンス変数と呼ばれます

今後、このインスタンス変数を操作することで

オブジェクトを操作することができます


# インスタンス化して呼び出し

```js

var hogeObject = { key1:value1, key2:value2 };

var insta = new hogeObject ([引数]);

//上記がプロパティの場合

insta.プロパティ名 [=設定値];

//上記がメソッドだった場合

insta.メソッド名t([引数...,]);

```

# 静的プロパティ、静的メソッド