JS.next

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

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

概要

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


let iterable = [3, 2, 1, 2, 3]
let set = new Set(iterable) 
set.forEach(function (val) { console.log(val) })

/*log
  3
  2
  1
*/
let iterable = [
  ['a', 1],
  ['b', 2],
  ['c', 3]
]
let map = new Map(iterable) 
map.forEach(function (val, key) { console.log(key, val) })

/*log
  "a" 1
  "b" 2
  "c" 3
*/
// コピー
let map2 = new Map(map)
let map3 = new Map(map.entries())

おまけ

実はイテレータを処理する過程では"add"、"set"メソッドが呼ばれる事になっている。
サブクラスでこれらをオーバーライドすることにより活かせるのだが、class構文が未実装な現状では活用は難しい。


実装されるバージョン

V8 3.28.2 3.28.60(デフォルト有効) 3.28.64(Weakの方も実装)
Chrome 38M?(デフォルト有効)