Firefox 24(Nightly) で {Array,Map,Set}.prototype.{keys,values,entries} メソッド等が実装された

  • Array.prototype
    • values()
  • Map.prototype
    • keys()
    • values()
    • entries()
  • Set.prototype
    • keys()
    • values()
    • entries()

辺りが実装された。

どのメソッドもイテレータを返す。

Array

var arr = ["a", "b", "c"];
var iter = arr.values(); // [object Array Iterator]
arr.push("d");
var v;
for (let v of iter) { // for (let v of arr) と同等
  console.log(v); // それぞれ、"a", "b", "c", "d" と出る
}

Map

var map = new Map;
map.set("key1", "value1");
map.set("key2", "value2");
var iter = map.keys();
map.set("key3", "value3");

for (let v of iter) {
  console.log(v); // それぞれ、 "key1", "key2", "key3" と出る
}
iter = map.values();
for (let v of iter) {
  console.log(v); // それぞれ、 "value1", "value2", "value3" と出る
}

iter = map.entries();
for (let v of iter) { // for (let v of map) と同等
  console.log(v); // それぞれ、["key1", "value1"], ["key2", "value2"], ["key3", "values3"] と出る
}

keyやvalueを分けて取れるのは良い感じ

Set

var s = new Set;
s.add("a");
s.add("b");
var iter = s.keys();
s.add("c");

for (let v of iter) {
  console.log(v); // それぞれ、"a", "b", "c" と出る
}

iter = s.values(); // s.keys() と同じ
for (let v of iter) {
  console.log(v); // それぞれ、"a", "b", "c" と出る
}

iter = s.entries();
for (let v of iter) {
  console.log(v); // それぞれ、["a", "a"], ["b", "b"], ["c", "c"] と出る
}

keys(), values() が同じというのは何か変な感じ。

最後に

個別に見ると、このメソッドは何故必要?と思うところはあるけど、全体的に考えると、同じメソッド名が使えるため、コードを分ける必要がなくなるメリットがありそう。

ECMAScript 6th的に、Map, Set に足りないのは forEach メソッドのみとだいぶ実装されてきた。(参考: http://teramako.github.io/ECMAScript/ecma6th_test.html