Firefox 24(Nightly) で {Array,Map,Set}.prototype.{keys,values,entries} メソッド等が実装された
- 869996 – Set.prototype.{keys, values, entries}
- 875433 – iterator methods of [Array, Map, Set].prototype should be same function object as entries/values
- 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)