ES2015
ES6という別名があるが、このバージョンから
ES<公開年>
というフォーマットが用いられるようになった
新機能
シンタックスシュガー
> ES6ではArray、Date、DOM Elementsのような組み込み関数を継承できます。
> オブジェクト生成時にCtorという関数が呼ばれ、以下の処理を行います。
> math + number + string + array + object APIs
> Mathライブラリ、配列変換、文字列操作、Object.assignなど多くのライブラリが追加されました。
> binary and octal literals
> 数値リテラルに2進数表記bと8進数表記oが追加されました。
補足: それ以前からPromiseを実現するライブラリがあった
多くのライブラリのPromiseはthenableに準拠することになった
そしてPromiseを扱うツールを本体の言語機能に追加した
そこでライブラリによるPromiseとの互換性を維持するためthenableにも対応した
JSらしさを感じる
promise以前の
コールバック地獄時代のコードをもう二度と考えたくない

主に使えない構文・オブジェクト
新機能がここまであるのに使えないのを書くのはネガティブでは...

ES2015までしか使えない環境で生のJavaScript書く場合は、使えない構文も考慮しないといけない

...obj
みたいなやつ
オブジェクトをバラバラに展開するのがだるくなる
async/awaitに慣れた人はこの形式で我慢できる
async_generator.jsfunction* generatorFunction() {
const result1 = yield Promise.resolve(1);
console.log(result1);
const result2 = yield Promise.resolve(2);
console.log(result2);
return 'Done';
}
function runGenerator(generator,...args) {
const gen = generator(...args);
function handle(result) {
if (result.done) return Promise.resolve(result.value);
return Promise.resolve(result.value).then(
res => handle(gen.next(res)),
err => handle(gen.throw(err))
);
}
return handle(gen.next());
}
// minifyed
// function runGenerator(e){const r=e();return function n(e){return e.done?Promise.resolve(e.value):Promise.resolve(e.value).then(e=>n(r.next(e)),e=>n(r.throw(e)))}(r.next())}
runGenerator(generatorFunction).then(result => console.log(result));