JS.next

JavaScriptの最新実装情報を追うブログ

ES2015

Function#nameについて

概要 ES2015からは名前の無い関数定義であっても、コンテキストによって関数のnameプロパティが定義されるようになった。

@@hasInstanceが実装された

概要 インスタンスであるか判定するためのビルトインシンボルが実装された。

末尾呼び出し最適化が実装された

概要 ある関数Aから別の関数Bを呼び出すとき、処理系は後で戻って来れるように一旦Aの状態を保存し、関数Bの処理に入る。 これが問題になるのは再帰の時で、数万回程度の再帰でスタックが一杯になり、エラーとなってしまう。 しかし、もし関数B呼び出しの際…

@@speciesが実装された

概要 クラスの種族を設定するためのビルトインシンボルが実装された。

Proxyについて

概要 Proxyを使うとオブジェクトに対する様々な操作に割り込み、好きな振る舞いをさせることが出来る。

正規表現系のシンボルが実装された

概要 ES2015以前は正規表現オブジェクトを引数で取る関数は一般に、内部で引数が正規表現オブジェクトであるかどうかの判定をして、独自の処理をしていたが、 ES2015からは代わりに各処理に合うシンボルプロパティを持っているかどうかの判定をし、そのシン…

@@toPrimitiveが実装された

概要 オブジェクトがプリミティブ型に変換される際に、どんな処理を行いどんな値を返すか決めるためのビルトインシンボルが実装された。

デフォルト引数が実装された

概要 引数が渡されなかった際のデフォルト値の設定が可能になった。

Spread要素が実装された

概要 配列リテラルでSpread要素を使うと、イテラブルとして展開してそれぞれを要素にしてくれる。

分割代入が実装された

概要 分割代入を用いると、複数の代入を1つにまとめることが出来る。

Object.assignが実装された

概要 Object.assignはオブジェクト同士をマージするJSerの誰もが長年追い求めた夢のメソッドである。

Array.prototype.copyWithinが実装された

概要 copyWithinは配列の一部の区間を任意の位置から貼り付ける破壊的メソッドである。

Reflect APIが実装された

概要 Reflectオブジェクトはグローバルに存在し、演算子がするような作用や、内部的に行われているような作用をメソッドの形で提供する。

new.targetメタプロパティについて

概要 「new.target」とは、ES2015で導入されたビルトインクラスのサブクラスを作る上で欠かせない存在である[[newTarget]]を取得するためのメタプロパティである。

Restパラメータ/Spreadコールが実装されてきている

概要 Restパラメータ/Spreadコールを使うと、可変長引数が扱いやすくなる。

オブジェクトリテラルのキーに式が使えるようになった

概要 今までオブジェクトリテラルのキー部分には固定の文字列を指定するしかなかったが、ES2015では動的な式の結果やSymbolを指定することができる。

Array.{of, from}が実装された

概要 配列を作る2つのArrayのスタティックメソッドが実装された。

@@isConcatSpreadableが実装された

概要 @@isConcatSpreadableは、Array.prototype.concatメソッドにおいての振る舞いを指定するビルトインシンボルである。

RegExp.prototype.flagsゲッターが実装された

概要 正規表現オブジェクトのフラグが何か取得するためのゲッターである。

ユニコードエスケープシーケンスが拡張された

概要 今まではサロゲートペアによる文字を1シーケンスで表すことが出来なかったが、ES2015では『\u{xxxxx}』の形式で「0xffff」を超える文字コードを表すことができる。

テンプレートリテラルが実装された

概要 テンプレート文字列を記述できる構文が実装された。

Class構文について

概要 待ち焦がれた人も多いことだろう。ES2015の一番の目玉機能とも言えるクラス構文が、ついにV8でサポートされた。 Class構文は、『関数(コンストラクタ)定義』+『.prototypeへのメソッド定義』の糖衣構文である。 JSで今まで様々に工夫されてきたクラ…

superキーワードについて

概要 長らく予約語であったsuperキーワードが、継承元の関数を呼ぶためのキーワードとして機能するようになった。

@@toStringTagが実装された

概要 例えば『Object.prototype.toString.call([])』と呼ぶと、『"[object Array]"』と帰ってくるが、 その「Array」の部分をどういう表記にするか設定できるビルトインシンボルが実装された。

プロパティの短縮定義記法が実装された

概要 オブジェクトリテラルが拡張されてプロパティを短く定義できるようになった。

正規表現のyフラグが実装された

概要 文字列の特定の位置からマッチさせたい時にyフラグを用いると、lastIndexの位置からのみマッチするようにできる。

メソッド定義記法が実装された

概要 オブジェクトリテラルが拡張されてメソッドを短く定義できるようになった。

@@unscopablesが実装された

概要 with文に与えたオブジェクトの特定のプロパティがスコープに含まれることを防ぐための、 ビルトイン"unscopables"シンボルが実装された。

ジェネレータについて

概要 V8でジェネレータ周りの実装が進んできたので、解説してみようと思う。

アロー関数が実装された

概要 ES2015を象徴する機能である、アロー関数構文の実装がついにV8で始まった。

2つのStringメソッドが実装された

概要 サロゲートペアを考慮して、String.fromCharCodeとString.prototype.charCodeAtと同じ働きをする String.fromCodePointとString.prototype.codePointAtメソッドが実装された。

型付配列に配列と同じメソッドが実装された

概要 ES5までは型付配列で配列のようなメソッドを使うことが出来ず、度々不便なこともあったが、 ES2015から多くの配列と同じメソッドが使えるようになった。

Map、Setが正しく実装された

概要 今までV8ではMap、Setコンストラクタの引数付きの呼び出しが正しく実装されていなかったが、この度正しく実装された。 引数にイテラブル(=@@iteratorメソッドを持つ)オブジェクトを渡すことで、それを元に初期化させることができる。

いろいろなオブジェクトに@@iteratorメソッドが実装された

概要 イテレータが期待される場面で呼ばれるビルトイン"iterator"シンボルメソッドが、様々なオブジェクトへ実装された。

イテレータについて

概要 V8でES2015のイテレーション周りの実装が進んできたので、解説してみようと思う。

{Map,Set}.prototype.{values,keys,entries}が実装された

概要 Array.prototype.{values,keys,entries}と同じような要領でコレクションを列挙することができる。 列挙される順序はコレクションに加えた順序と同じであることが保証される。

for文でのlet変数が毎ループ新スコープを持つようになった

概要 かつてはfor文初期化句で宣言された変数は、for文の直前で宣言されたように振舞っていたが、各ループでスコープを引きづらないように仕様が変更され、V8も追従した。

ES2015では何が同値とみなされるか まとめ

概要 ES2015で導入されるObject.isとCollectionのkeyにおいて、何が「同じ」と見なされるのかをまとめてみる。

Array.prototype.fillが実装された

概要 配列の指定した範囲を、指定した値で満たすことができる、破壊的メソッドである。

{Map,Set}.prototype.forEachが実装された

概要 Array.prototype.forEachと同じような要領でコレクションを列挙することができる。 列挙される順序はコレクションに加えた順序と同じであることが保証される。

Weak Collectionsがデフォルトで有効になった

概要 ES2015で導入される機能である、Promise、WeakMap、WeakSetコンストラクタがデフォルトで有効になった。

Symbolについて

概要 ES2015ではUndefined、Null、Boolean、Number、String、Objectの6つの型に加えて、新しい型Symbolが導入された。 シンボルはプリミティブ型で、文字列のようにプロパティのキーとして使える特徴を持つ。

String.prototype.normalizeが実装された

実装されたメソッド String.prototype.normalize(form = "NFC") form(初期値:"NFC")の形式で正規化した文字列を返す

MapとSetが+0と-0を区別しなくなった

概要 MapやSetとは、キーにあらゆる型のあらゆる値を使えるコレクションである。 かつてはキーとして+0と-0を区別していたのだが、区別しないことになり、V8の実装も追従した。

String.prototype.{startsWith,endsWith,includes} が正規表現を受け付けなくなった

概要 これらは文字列を期待するメソッドだが、splitの用に正規表現も受け付けると思われて解決しづらいバグの元になってしまわないように、正規表現オブジェクトが渡された時は専用のエラーを出すことになり、V8の実装も追従した。

Object.setPrototypeOfが実装された

実装されたメソッド Object.setPrototypeOf(target, proto) targetオブジェクトのプロトタイプをprotoに設定する 返り値はtargetで、protoはオブジェクトまたはnullである必要がある

Object.getOwnPropertySymbolsが実装された

実装されたメソッド Object.getOwnPropertySymbols(obj) オブジェクトが持つ全てのシンボルキーの配列を返す (文字列キーにおけるgetOwnPropertyNamesのシンボルキー版) シンボルに付いてはコチラの記事を参照

Numberコンストラクタに新しい関数と定数が実装された

概要 NumberコンストラクタにES2015で追加された3個の定数と6個の関数が実装された。

Promiseについて

概要 Promiseとは非同期処理を上手く扱う為のAPIであり、パターンである。 非同期の処理の完了後に続けて処理を行いたいとき、よくコールバックパターンが使われるが、処理が連続するとコールバック地獄と言われる分かりづらいソースコードになってしまう。 …

新しいMath関数が実装された

概要 ES6で新しく入った16個(?)のMath関数の実装が始まった。 (ただしMath.imulは暫く前から実装済み)