jsの記録2017-02-04

# シンボル

まずはシンボルを生成する

```

let sym1 = Symbol('sym')
let sym2 = Symbol('symmmmmm')

console.log(typeof sym1) //sym

console.log(sym1.toString())
console.log(sym2.toString())

```

Symboleはプリミティブ型で、文字レウのようにプロパティのキーとして使える。

# プリミティブ型とオブジェクトの違い

まずは実装例の違いを見てみましょう、下記の二つのコードはプリミティブ型とオブジェクト型のデータ型の違いを表しています。

```js

var pri = 'abc';

var obj = new String('abc');

console.log(pri);

console.log(obj);

```

![スクリーンショット 2017-02-04 1.40.59.png](https://qiita-image-store.s3.amazonaws.com/0/135794/4fbf3b31-5e39-d5a9-0ff0-2e3119927526.png "スクリーンショット 2017-02-04 1.40.59.png")

上記のコードを読んでみればわかるように、インスタンス化した変数objは、オブジェクトが代入されていることがわかります。プリミティブ型とは、値のみの型で、オブジェクトは、プロパティやメソッドを持つことができるという違いがあります


# Symbole - 型変換(数値・文字列)

Symboleは数値、文字列への暗黙的な型変換はできない

```errSymbol
console.log(sym1 + ""); /err

console.log(dym1 - 0); //err

```

# Symbol - 型変換(boolean型)

Symbolはboolean型への変換はできる

```Symbol

let hoge = Symbol('sym1');
let piyo = Symbol('sym2');

console.log(typeof !!hoge);

```

# Symbol - 値としての利用(定数)

Symbolを定数の値として利用する

ここまで、独特なSymboleの特徴を紹介してきましたが、ここまでだとまだイマイチ具体的な実装方法が思い浮かびませんよね。それでは、一つ具体的な実装例を紹介しましょう。

下記は列挙定数を表すようなケースです値そのものには意味がなく、名前にだけ意味があるようなものが列挙定数？値そのものに意味はなく、名前にだけ意味がある。

```const

const Monday = 0;

```

上記のコードは、値には意味はなく、Mondayに意味があります。しかし、これレアの定数を利用すべき文脈で、定数、数値、いずれを利用してもエラーにはなりません。

```use_const

if (Monday === 0){

	console.log(true)
};



if (Monday === Monday){

	console.log(true)
};

```

コードの可読性を考えれば、0で比較するのは望ましい状態ではありません。それに、似たような定数が出てくれば、バグの温床にもなります。なので、定数の値としSymbolを利用するのです。

# ConstをSymbolで定義する

```ConstSymbole

const Monday = Symbol();
const Sataday = Symbol();

```

こうすると、値という概念がなくなるの、誤算で値が参照されることもなく、例えばMondayと等しいのは対数Mondayだけです。

# Mathオブジェクト

基本的な数学演算を行うMathオブジェクトです。

Mathオブジェクトが提供するメンバーは、すべて静的プロパティ/メソッドである点

# 値の集合を管理する/Array/Map/Set オブジェクト

上記の三つ,Array,Map,setは、値の集合を操作するオブジェクトとしてJavascriptで提供されています。Arrayは、ここの集合をインデックスで管理し、値の重複はあっても大丈夫です。Mapは、キーと値の二つでここの集合を管理し、値の重複はあってはなりません。Setは、値に順番はなく、値の重複はNGです。

Arrayは普通に配列を生成して作ることもできますが、下記のようにコンストラクタとして生成することもできます。

```js

//指定の要素で配列を生成する
//空っぽの配列を生成する
//サイズを指定して生成する

var array = new array('a', 'b', 'c');

var array = new array();

var array = new array(10);

```

ただし、コンストラクターを使用した場合は、意味的に曖昧になりやすいという問題点があります。なので、javascriptで配列を生成するときは、コンストラクターはなるべく使わず、なるべく配列リテラルを使用するようにします。

```arrayriteral

//配列リテラルで空の配列を生成する場合は

var array = [];

```

Arrayやifやその他、プログラミング言語の基本データ型と呼ばれるものたちには、多くが、多くのメンバーを持っています。それは、lengthだったり、です。基本データ型はラッパーオブジェクトですので、インスタンス化する必要はありません。基本んデータ型を使うとき、複雑な処理やイレギュラーな処理をするかもしれなくなったら、データ型のメンバや、そのデータ型がもつ能力に目を向けて、どんな機能を彼が持ってるのか調べましょう。

# 破壊的なメソッド

破壊的なメソッドとは、その配列（またはオブジェクト）が呼び出されると、その時点で配列（またはオブジェクト）そのものが変更されるということです。

# コールバック関数

[JavaScriptコールバックを整理してみた【再入門】](http://qiita.com/nekoneko-wanwan/items/f6979f687246ba089a35)


コールバック関数を一言で説明すると、引数として渡される関数のことを言います。コールバック関数hogeがあったとしたら、コールバック関数hogeは、関数piyoの引数として渡されて初めてコールバック関数になります。piyo関数が処理が終わったら、hoge関数を実行したいという時に使います。


例えば、以下のコードはonclickをした後に、コールバック関数を処理するよという簡単なコールバック関数の実装事例です

```

$(#triger).onclick(function(e){


console.log('hello');

)

//コールバック関数を外に出す場合は

var hoge = $function(e){'hello'};

conclick(hoge);

```

# push pop unshiftメソッドのデータ構造の違い

```js

console.log(hogehoge.pop());
//popは、配列の末尾を取得して削除する
console.log(hogehoge)
//破壊的な配列、popした後は、配列の値は削除さ出力される


var hogehoge = ['sato', 'tanaka', 'ito'];


console.log(hogehoge.pop());
//popは、配列の末尾を取得して削除する
console.log(hogehoge)
//破壊的な配列、popした後は、配列の値は削除さ出力される

console.log(hogehoge.push('kato'));
//pushは配列に要素を追加する
console.log(hogehoge)

console.log(hogehoge.shift());
console.log(hogehoge);

console.log(hogehoge.unshift());
console.log(hogehoge);

```

# スタックとキュー

スタックとは、後入れ先出し、または先入れ後出しという意味です。例えば、アプリなどにあるundo機能は、一番直近の操作（一番最後の操作）を履歴として保存しておき、開いた時に一番最初に出力されるというデータ構造です。

# スタックは、pushとpopで実装できます。

実装の手順は、まずはからの配列を用意して、pushで中に入れて行って、popで最後から取り出すという実装方法です

```poppush

//1 -> 2 -> 3　とという順番で入れて 一番最後の3を取り出す

console.log(empty.pop());

```

# キュー

キューは、先入れ先出しのデータ構造です。先入れ先出しのキューを使うにはJavascriptだとshiftを用いることができます。