ES6(ES2015) でサポートされたオブジェクトで、キーとバリューのリストを保持します。Chrome 38, Firefox 13, Internet Explorer 11, Opera 25, Safari 7.1 以降で使用できます。Map と Object は似ていますが、Map には、文字列や Symbol 以外の値もキーとして利用できる、リストの個数を size で簡単に得ることができる、for (... of ...) で簡単にループ処理できる、などの利点があります。
var map = new Map(); map.set("width", 160); map.set("height", 120); map.get("width"); // 160 map.get("height"); // 120
コンストラクタにはキーとバリューの二次元配列を指定できます。Internet Explorer と Safari ではサポートされていません。
var map = new Map([["width", 160], ["height", 120]]);
リストの個数を返します。
var map = new Map();
map.set("width", 160);
map.set("height", 120);
map.size; // => 2
for ... of 文でキー・バリューのリストを扱うことができます。Internet Explorer と Opera ではサポートされていません。
for (var [key, value] of map) { console.log(key, ":", value); } for (var key of map.keys()) { console.log(key, ":", map.get(key)); } for (var value of map.values()) { console.log(value); } for (var [key, value] of map.entries()) { console.log(key, ":", value); }
forEach 文でキー・バリューのリストを扱うことができます。こちらは、Internet Explorer でもサポートされていますが、Opera でサポートされていません。
map.forEach(function(value) { console.log(value); }) map.forEach(function(value, key) { console.log(key, ":", value); }) map.forEach(function(value, key, map) { map.set(key, value * 2); console.log(key, ":", map.get(key)); // map自体を変更することが可能 }); map.forEach(function(value, key) { this.set(key, value * 2); console.log(key, ":", this.get(key)); }, map); // mapをthisとして引き渡す
key で指定したマップが存在すれば true を、存在しなければ false を返します。
var map = new Map();
map.set("width", 160);
map.has("width"); // => true
key で指定したマップを削除します。
var map = new Map(); map.set("width", 160); map.delete("width");
clear() はマップの情報を消去します。Opera ではサポートされていません。
map.clear(); // mapの中身をすべて消去
WeakMap は Map と似た機能ですが、(1) キーとして利用できるのはオブジェクトのみ、(2) キーは弱参照されガベージコレクションの変数保持の対象とならない、(3) 弱参照のため keys() 等によるキーの一覧を取得することはできない、などの特徴を持ちます。使用例は下記を参照してください。
// Personクラスを定義する class Person { constructor(name) { this.name = name } getName() { return(this.name); } } // 趣味(favorites)強参照マップと、宗教(religions)弱参照マップを定義する const favorites = new Map(); const religions = new WeakMap(); // 処理の中で趣味マップと、宗教マップを利用する function doSomething() { // 山田さんオブジェクトを生成 let p1 = new Person("Yamada", 26); console.log(p1.getName()); // 山田さんの趣味は野球 favorites.set(p1, "Baseball"); console.log(favorites.get(p1)); // 山田さんの宗教は仏教 religions.set(p1, "Buddhism"); console.log(religions.get(p1)); } doSomething(); // 趣味マップは強参照のため、後からでも参照できるけど、ガベージコレクションされない for (var key of favorites.keys()) { console.log(key.name + ":" + favorites.get(key)); } // 宗教マップは弱参照のため、後から参照できないけど、ガベージコレクションされる for (var key of religions.keys()) { // TypeError console.log(key.name + ":" + religions.get(key)); }