Map オブジェクトは単純なキー/値写像(マップ)です。キーあるいは値として任意の値(オブジェクト、プリミティブ値とも)を使うことができます。

構文

new Map([iterable])

引数

iterable
要素がキー・値の対(2 要素の配列)である Array または他の反復処理可能なオブジェクトです(例: [[ 1, 'one' ],[ 2, 'two' ]])。それぞれのキー・値ペアが新しい Map に追加されます。nullundefined と同じに扱われます(訳注:つまり引数を指定しない場合と同じに扱われます)。

解説

Map オブジェクトはその要素について挿入順で反復処理を行うことができます。for...of ループは各処理で [キー, 値] の配列を返します。

ObjectMap、特に辞書の辞書であるMapは、Objectの挿入順にのみマップされることに注意してください。これは、ランダムで順序付けられていません。

キーの等価性

キーの等価性は「same-value」アルゴリズムに基づきます:(NaN !== NaN であるにもかかわらず)NaNNaN と同一と見なされ、他のすべての値は === 演算子の動作に従って等しいと見なされます。ECMAScript 6 ドラフトの以前の版では(-0 === +0 であるにもかかわらず) -0+0 は異なると見なされていましたが、後の版で変更され、Gecko 29 (Firefox 29 / Thunderbird 29 / SeaMonkey 2.26) (バグ 952870) と最近の nightly Chrome で適用されています。

オブジェクトとマップの比較

ObjectsMap は、両者とも値へのキーを設定したり、それらの値を取り出したり、キーを削除したり、また何かがあるキーに格納されているかを判定したりすることができるという点で似ています。このため、歴史的に ObjectMap として使われてきました。しかし、Map の使用を望ましくする ObjectMap 間の重要な違いが存在します。

  • Object のキーは StringsSymbols ですが、Map では任意の値がキーとなり得ます。
  • Map の大きさは size プロパティで簡単に得ることができます。一方、Object の大きさは手動で保つ必要があります。
  • Map は iterable で ダイレクトに反復処理できる一方、オブジェクトを反復処理するには、何らかの方法でキーを取得し、それらのキーを元に反復処理する必要があります。
  • Object はプロトタイプを持つため、既定のキーがマップ中に存在します。ES5ではこれを map = Object.create(null) を使うことで回避することができますが、推奨しません。
  • Map は、頻繁に要素を追加したり削除したりするシナリオでは、パフォーマンスがObject に比べて良い場合があります。

プロパティ

Map.length
length プロパティの値は 0 です。
get Map[@@species]
派生クラスを生成するためのコンストラクタ関数です。
Map.prototype
Map コンストラクタのプロトタイプを表します。すべての Map オブジェクトに追加のプロパティを定義できます。

Map インスタンス

すべての Map インスタンスは Map.prototype を継承します。

プロパティ

Map.prototype.constructor
インスタンスのプロトタイプを生成する関数を返します。これはデフォルト Map 関数です。
Map.prototype.size
Mapオブジェクト内のキー/バリューペアの数を返します。

メソッド

Map.prototype.clear()
Mapオブジェクトからすべてのキー/バリューペアを削除します。
Map.prototype.delete(key)
keyに関連した値を削除しMap.prototype.has(value)が以前返した値を返します。Map.prototype.has(key)はその後falseを返します。
Map.prototype.entries()
Mapオブジェクト内の要素に対して挿入順に [key, value]の配列を含む新しいIterator オブジェクトを返します。
Map.prototype.forEach(callbackFn[, thisArg])
Mapオブジェクトに存在するキー/バリューペアに対して挿入順に一回callback関数を呼び出します。thisArg 引数がforEachに提供された場合、callbackに対するこの値として使われます。
Map.prototype.get(key)
keyに関連した値を返します。存在しない場合、undefinedを返します。
Map.prototype.has(key)
Mapオブジェクト内にkeyに関連した要素が存在するかどうかを示すbooleanを返します。
Map.prototype.keys()
Mapオブジェクト内の要素に対して挿入順にkeys を含む新しい Iterator オブジェクトを返します。
Map.prototype.set(key, value)
Mapオブジェクト内にkeyに対する値を設定します。Map オブジェクトを返します。
Map.prototype.values()
Mapオブジェクトの要素に対して挿入順にvaluesを含む新しいIterator オブジェクトを返します。
Map.prototype[@@iterator]()
Mapオブジェクト内の要素に対して挿入順に[key, value]の配列を含む新しい Iterator オブジェクトを返します。

Map オブジェクトの使用

var myMap = new Map();

var keyString = "文字列",
    keyObj = {},
    keyFunc = function() {};

// 値を設定する
myMap.set(keyString, "'文字列' と関連付けられた値");
myMap.set(keyObj, "keyObj と関連付けられた値");
myMap.set(keyFunc, "keyFunc と関連付けられた値");

myMap.size; // 3

// 値を取得する
myMap.get(keyString);    // "'文字列' と関連付けられた値"
myMap.get(keyObj);       // "keyObj と関連付けられた値"
myMap.get(keyFunc);      // "keyFunc と関連付けられた値"

myMap.get("文字列");   // "'文字列' と関連付けられた値"
                         // keyString === '文字列' であるため
myMap.get({});           // undefined, keyObj !== {} であるため
myMap.get(function() {}) // undefined, keyFunc !== function () {} であるため

Map のキーとしての NaN の 使用

NaN もまたキーとして使うことができます。すべての NaN は自身と等しくない(NaN !== NaN は真)にもかかわらず、以下の例は動作します。これは NaN が互いに区別できないためです。

var myMap = new Map();
myMap.set(NaN, 'not a number');

myMap.get(NaN); // "not a number"

var otherNaN = Number('foo');
myMap.get(otherNaN); // "not a number"

for..of を使用する Map の反復処理

Map は for..of ループを使用して反復処理を行うことができます。

var myMap = new Map();
myMap.set(0, 'zero');
myMap.set(1, 'one');
for (var [key, value] of myMap) {
  console.log(key + ' = ' + value);
}
// 0 = zero
// 1 = one

for (var key of myMap.keys()) {
  console.log(key);
}
// 0
// 1

for (var value of myMap.values()) {
  console.log(value);
}
// zero
// one

for (var [key, value] of myMap.entries()) {
  console.log(key + ' = ' + value);
}
// 0 = zero
// 1 = one

forEach()Maps を反復処理

Map は forEach() メソッドを使用して反復できます:

myMap.forEach(function(value, key) {
  console.log(key + ' = ' + value);
});
// 1行目に"0 = zero"、2行目に"1 = one"が出力されます。

Array オブジェクトとの関係

var kvArray = [["キー1", "値1"], ["キー2", "値2"]];

// 通常の Map コンストラクタを使って、キー・値の 2 次元配列をマップに変換する
var myMap = new Map(kvArray);

myMap.get("キー1"); // "値1" を返す

// 展開演算子を使って、マップをキー・値の 2 次元配列に変換する
console.log(Array.from(myMap)); // kvArray とまったく同じ Array を表示する

// あるいは展開演算子をキーまたは値のイテレータに使って、キーまたは値のみの配列を得る
console.log(Array.from(myMap.keys())); // ["key1", "key2"] が出力される

標準仕様

仕様書 策定状況 コメント
ECMAScript 2015 (6th Edition, ECMA-262)
Map の定義
標準 初期定義。
ECMAScript Latest Draft (ECMA-262)
Map の定義
ドラフト  

ブラウザ互換性

Update compatibility data on GitHub
デスクトップモバイルサーバー
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewAndroid 版 ChromeEdge MobileAndroid 版 FirefoxAndroid 版 OperaiOS 版 SafariSamsung InternetNode.js
基本対応Chrome 完全対応 38Edge 完全対応 12Firefox 完全対応 13IE 完全対応 11Opera 完全対応 25Safari 完全対応 8WebView Android 完全対応 38Chrome Android 完全対応 38Edge Mobile 完全対応 12Firefox Android 完全対応 14Opera Android 完全対応 25Safari iOS 完全対応 8Samsung Internet Android 完全対応 ありnodejs 完全対応 0.12
完全対応 0.12
完全対応 0.10
無効
無効 From version 0.10: this feature is behind the --harmony runtime flag.
new Map(iterable)Chrome 完全対応 38Edge 完全対応 12Firefox 完全対応 13IE 未対応 なしOpera 完全対応 25Safari 完全対応 9WebView Android 完全対応 38Chrome Android 完全対応 38Edge Mobile 完全対応 12Firefox Android 完全対応 14Opera Android 完全対応 25Safari iOS 完全対応 9Samsung Internet Android 完全対応 ありnodejs 完全対応 0.12
new Map(null)Chrome 完全対応 ありEdge 完全対応 12Firefox 完全対応 37IE 完全対応 11Opera 完全対応 ありSafari 完全対応 9WebView Android 完全対応 ありChrome Android 完全対応 ありEdge Mobile 完全対応 12Firefox Android 完全対応 37Opera Android 完全対応 ありSafari iOS 完全対応 9Samsung Internet Android 完全対応 ありnodejs 完全対応 0.12
完全対応 0.12
完全対応 0.10
無効
無効 From version 0.10: this feature is behind the --harmony runtime flag.
Map() without new throwsChrome 完全対応 ありEdge 完全対応 12Firefox 完全対応 42IE 完全対応 11Opera 完全対応 ありSafari 完全対応 9WebView Android 完全対応 ありChrome Android 完全対応 ありEdge Mobile 完全対応 12Firefox Android 完全対応 42Opera Android 完全対応 ありSafari iOS 完全対応 9Samsung Internet Android 完全対応 ありnodejs 完全対応 0.12
Key equality for -0 and 0Chrome 完全対応 38Edge 完全対応 12Firefox 完全対応 29IE 未対応 なしOpera 完全対応 25Safari 完全対応 9WebView Android 完全対応 38Chrome Android 完全対応 38Edge Mobile 完全対応 12Firefox Android 完全対応 29Opera Android 完全対応 25Safari iOS 完全対応 9Samsung Internet Android 完全対応 ありnodejs 完全対応 4.0.0
clearChrome 完全対応 38Edge 完全対応 12Firefox 完全対応 19IE 完全対応 11Opera 完全対応 25Safari 完全対応 8WebView Android 完全対応 38Chrome Android 完全対応 38Edge Mobile 完全対応 12Firefox Android 完全対応 19Opera Android 完全対応 25Safari iOS 完全対応 8Samsung Internet Android 完全対応 ありnodejs 完全対応 0.12
deleteChrome 完全対応 38Edge 完全対応 12Firefox 完全対応 13IE 完全対応 11Opera 完全対応 25Safari 完全対応 8WebView Android 完全対応 38Chrome Android 完全対応 38Edge Mobile 完全対応 12Firefox Android 完全対応 14Opera Android 完全対応 25Safari iOS 完全対応 8Samsung Internet Android 完全対応 ありnodejs 完全対応 0.12
完全対応 0.12
完全対応 0.10
無効
無効 From version 0.10: this feature is behind the --harmony runtime flag.
entriesChrome 完全対応 38Edge 完全対応 12Firefox 完全対応 20IE 未対応 なしOpera 完全対応 25Safari 完全対応 8WebView Android 完全対応 38Chrome Android 完全対応 38Edge Mobile 完全対応 12Firefox Android 完全対応 20Opera Android 完全対応 25Safari iOS 完全対応 8Samsung Internet Android 完全対応 ありnodejs 完全対応 0.12
forEachChrome 完全対応 38Edge 完全対応 12Firefox 完全対応 25IE 完全対応 11Opera 完全対応 25Safari 完全対応 8WebView Android 完全対応 38Chrome Android 完全対応 38Edge Mobile 完全対応 12Firefox Android 完全対応 25Opera Android 完全対応 25Safari iOS 完全対応 8Samsung Internet Android 完全対応 ありnodejs 完全対応 0.12
getChrome 完全対応 38Edge 完全対応 12Firefox 完全対応 13IE 完全対応 11Opera 完全対応 25Safari 完全対応 8WebView Android 完全対応 38Chrome Android 完全対応 38Edge Mobile 完全対応 12Firefox Android 完全対応 14Opera Android 完全対応 25Safari iOS 完全対応 8Samsung Internet Android 完全対応 ありnodejs 完全対応 あり
hasChrome 完全対応 38Edge 完全対応 12Firefox 完全対応 13IE 完全対応 11Opera 完全対応 25Safari 完全対応 8WebView Android 完全対応 38Chrome Android 完全対応 38Edge Mobile 完全対応 12Firefox Android 完全対応 14Opera Android 完全対応 25Safari iOS 完全対応 8Samsung Internet Android 完全対応 ありnodejs 完全対応 あり
keysChrome 完全対応 38Edge 完全対応 12Firefox 完全対応 20IE 未対応 なしOpera 完全対応 25Safari 完全対応 8WebView Android 完全対応 38Chrome Android 完全対応 38Edge Mobile 完全対応 12Firefox Android 完全対応 20Opera Android 完全対応 25Safari iOS 完全対応 8Samsung Internet Android 完全対応 ありnodejs 完全対応 0.12
prototypeChrome 完全対応 38Edge 完全対応 12Firefox 完全対応 13IE 完全対応 11Opera 完全対応 25Safari 完全対応 8WebView Android 完全対応 38Chrome Android 完全対応 38Edge Mobile 完全対応 12Firefox Android 完全対応 14Opera Android 完全対応 25Safari iOS 完全対応 8Samsung Internet Android 完全対応 ありnodejs 完全対応 あり
setChrome 完全対応 38Edge 完全対応 12Firefox 完全対応 13IE 部分対応 11
補足
部分対応 11
補足
補足 Returns 'undefined' instead of the 'Map' object.
Opera 完全対応 25Safari 完全対応 8WebView Android 完全対応 38Chrome Android 完全対応 38Edge Mobile 完全対応 12Firefox Android 完全対応 14Opera Android 完全対応 25Safari iOS 完全対応 8Samsung Internet Android 完全対応 ありnodejs 完全対応 あり
sizeChrome 完全対応 38Edge 完全対応 12Firefox 完全対応 19
補足
完全対応 19
補足
補足 From Firefox 13 to Firefox 18, the size property was implemented as a Map.prototype.size() method, this has been changed to a property in later versions conform to the ECMAScript 2015 specification.
IE 完全対応 11Opera 完全対応 25Safari 完全対応 8WebView Android 完全対応 38Chrome Android 完全対応 38Edge Mobile 完全対応 12Firefox Android 完全対応 19
補足
完全対応 19
補足
補足 From Firefox 13 to Firefox 18, the size property was implemented as a Map.prototype.size() method, this has been changed to a property in later versions conform to the ECMAScript 2015 specification.
Opera Android 完全対応 25Safari iOS 完全対応 8Samsung Internet Android 完全対応 ありnodejs 完全対応 0.12
valuesChrome 完全対応 38Edge 完全対応 12Firefox 完全対応 20IE 未対応 なしOpera 完全対応 25Safari 完全対応 8WebView Android 完全対応 38Chrome Android 完全対応 38Edge Mobile 完全対応 12Firefox Android 完全対応 20Opera Android 完全対応 25Safari iOS 完全対応 8Samsung Internet Android 完全対応 ありnodejs 完全対応 0.12
@@iteratorChrome 完全対応 ありEdge 完全対応 ありFirefox 完全対応 36
完全対応 36
未対応 27 — 36
補足 代替名
補足 A placeholder property named @@iterator is used.
代替名 非標準の名前 @@iterator を使用しています。
未対応 17 — 27
補足 代替名
補足 A placeholder property named iterator is used.
代替名 非標準の名前 iterator を使用しています。
IE 未対応 なしOpera 完全対応 ありSafari 完全対応 ありWebView Android 完全対応 ありChrome Android 完全対応 ありEdge Mobile 完全対応 ありFirefox Android 完全対応 36
完全対応 36
未対応 27 — 36
補足 代替名
補足 A placeholder property named @@iterator is used.
代替名 非標準の名前 @@iterator を使用しています。
未対応 17 — 27
補足 代替名
補足 A placeholder property named iterator is used.
代替名 非標準の名前 iterator を使用しています。
Opera Android 完全対応 ありSafari iOS 完全対応 ありSamsung Internet Android 完全対応 ありnodejs 完全対応 0.12
@@speciesChrome 完全対応 51Edge 完全対応 13Firefox 完全対応 41IE 未対応 なしOpera 完全対応 38Safari 完全対応 10WebView Android 完全対応 51Chrome Android 完全対応 51Edge Mobile 完全対応 13Firefox Android 完全対応 41Opera Android 完全対応 38Safari iOS 完全対応 10Samsung Internet Android 完全対応 5.0nodejs 完全対応 6.5.0
完全対応 6.5.0
完全対応 6.0.0
無効
無効 From version 6.0.0: this feature is behind the --harmony runtime flag.
@@toStringTagChrome 完全対応 44Edge 未対応 なしFirefox 未対応 なしIE 未対応 なしOpera 未対応 なしSafari 未対応 なしWebView Android 完全対応 44Chrome Android 完全対応 44Edge Mobile 未対応 なしFirefox Android 未対応 なしOpera Android 未対応 なしSafari iOS 未対応 なしSamsung Internet Android 完全対応 4.0nodejs 未対応 なし

凡例

完全対応  
完全対応
部分対応  
部分対応
未対応  
未対応
実装ノートを参照してください。
実装ノートを参照してください。
ユーザーが明示的にこの機能を有効にしなければなりません。
ユーザーが明示的にこの機能を有効にしなければなりません。
非標準の名前を使用しています。
非標準の名前を使用しています。

関連情報

ドキュメントのタグと貢献者

最終更新者: dlwe,