BabelのLearn ES6を学んでいく（３

https://babeljs.io/docs/learn-es6/#map-set-weak-map-weak-set
[前回](http://qiita.com/kazusa-qooq/items/1566aeaa34eaff7ad402)に引き続きBabelのLearn ES6で新しいJavaScriptを学んでいきます。なにか間違いありましたらご指摘いただけると助かります。

###Map + Set + WeakMap + WeakSet
* MapやSetがサポートされました
* Weak系はsizeプロパティを持ちません
* またWeak系は弱い参照により、登録した要素がどこからも参照されていない場合、要素を保持しません
* 例：http://www.es6fiddle.net/i8ar4ox7/

###Symbols
* Symbolは新しいプリミティブ型です
* `Symbol(<key>)`で定義します。
* keyが同一であってもSymbolは別扱いになります
* 例：http://www.es6fiddle.net/i8arqd64/

###Subclassable Built-ins
* Array, Date, DOM Elementなどのサブクラスが作成可能です
* 例：http://www.es6fiddle.net/i8as3c2a/

###Math + Number + String + Object APIs
* APIが多数追加されました
* 一部動作しないものがありました

```
console.log(Number.EPSILON);
console.log(Number.isInteger(Infinity)) // false
console.log(Number.isNaN("NaN")) // false

console.log(Math.acosh(3)) // 1.762747174039086
console.log(Math.hypot(3, 4)) // 5
console.log(Math.imul(Math.pow(2, 32) - 1, Math.pow(2, 32) - 2)) // 2

console.log("abcde".includes("cd") )// true
console.log("abc".repeat(3) )// "abcabcabc"
console.log(Array.of(1, 2, 3) )// Similar to new Array(...), but without special one-arg behavior
//[0, 0, 0].fill(7, 1) // [0,7,7]
//[1,2,3].findIndex(x => x == 2) // 1
//["a", "b", "c"].entries() // iterator [0, "a"], [1,"b"], [2,"c"]
//["a", "b", "c"].keys() // iterator 0, 1, 2
//["a", "b", "c"].values() // iterator "a", "b", "c"

class Point{
	constructor(x,y){
	}
}

Object.assign(Point, { origin: new Point(0,0) })
console.log(Point)
```

``` 実行結果.
C:\workspace\babel\src>babel-node script.js
2.220446049250313e-16
false
false
1.762747174039086
5
2
true
abcabcabc
[ 1, 2, 3 ]
{ [Function: Point] origin: {} }

C:\workspace\babel\src>
```

###Binary and Octal Literals
* ２進数(0b)と８進数(0o)リテラルが追加されました
* 例：http://www.es6fiddle.net/i8ascghe/

###Promises
* 非同期処理のためにPromiseが導入されました
* 例：http://www.es6fiddle.net/i8asjvrl/

###Reflect API
* メタレベルの動的実行のためにリフレクトAPIが導入されました

``` script.js
var O = {a: 1};
Object.defineProperty(O, 'b', {value: 2});
O[Symbol('c')] = 3;

console.log(Reflect.ownKeys(O)); // ['a', 'b', Symbol(c)]

function C(a, b){
  this.c = a + b;
}
var instance = Reflect.construct(C, [20, 22]);
console.log(instance)
```

``` 実行結果.
C:\workspace\babel\src>babel-node script.js
[ 'a', 'b', Symbol(c) ]
{ c: 42 }

C:\workspace\babel\src>
```

###Tail Calls
末尾での再帰呼び出しに限り、スタックオーバーフローが起きないことを保証します。

``` script.js
function factorial(n, acc = 1) {
    "use strict";
    if (n <= 1) return acc;
    return factorial(n - 1, n * acc);
}

// Stack overflow in most implementations today,
// but safe on arbitrary inputs in eS6
factorial(100000)
```

``` 実行結果.
C:\workspace\babel\src>babel-node script.js

C:\workspace\babel\src>
```

``` ダメな例.
function factorial(n, acc = 1) {
    "use strict";
    if (n > 1){
    	acc = factorial(n - 1, n * acc);
    }
    return acc;
}

// Stack overflow in most implementations today,
// but safe on arbitrary inputs in eS6
factorial(100000)
```

``` 実行結果.
C:\workspace\babel\src\script.js:3
function factorial(n) {
                  ^
RangeError: Maximum call stack size exceeded
    at factorial (C:/workspace/babel/src/script.js:1:19)
    at factorial (C:/workspace/babel/src/script.js:4:12)
    at factorial (C:/workspace/babel/src/script.js:4:12)
    at factorial (C:/workspace/babel/src/script.js:4:12)
    at factorial (C:/workspace/babel/src/script.js:4:12)
    at factorial (C:/workspace/babel/src/script.js:4:12)
    at factorial (C:/workspace/babel/src/script.js:4:12)
    at factorial (C:/workspace/babel/src/script.js:4:12)
    at factorial (C:/workspace/babel/src/script.js:4:12)
    at factorial (C:/workspace/babel/src/script.js:4:12)

C:\workspace\babel\src>
```

以上で終わりになります。