We're looking for a user researcher to understand the needs of developers and designers. Is this you or someone you know? Check out the post: https://mzl.la/2IGzdXS

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

構文

new Map([iterable])

引数

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

解説

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

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

キーの等価性

キーの等価性は「same-value」アルゴリズムに基づきます:NaNNaN と同一(NaN !== NaN にもかかわらず)と見なされ、他のすべての値は === 演算子の動作に従って等しいと見なされます。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 の定義
ドラフト  

ブラウザ互換性

機能ChromeEdgeFirefoxInternet ExplorerOperaSafari
基本対応38121311258
new Map(iterable)381213 なし259
new Map(null) あり123711 あり9
Map() without new throws あり124211 あり9
Key equality for -0 and 0381229 なし259
clear38121911258
delete38121311258
entries381220 なし258
forEach38122511258
get38121311258
has38121311258
keys381220 なし258
prototype38121311258
set381213111258
size381219211258
values381220 なし258
@@iterator あり あり

36

27 — 363 4

17 — 275 6

なし あり あり
@@species511341 なし3810
@@toStringTag44 なし なし なし なし なし
機能Android webviewChrome for AndroidEdge mobileFirefox for AndroidOpera AndroidiOS SafariSamsung Internet
基本対応38381214258 あり
new Map(iterable)38381214259 あり
new Map(null) あり あり1237 あり9 あり
Map() without new throws あり あり1242 あり9 あり
Key equality for -0 and 038381229259 あり
clear38381219258 あり
delete38381214258 あり
entries38381220258 あり
forEach38381225258 あり
get38381214258 あり
has38381214258 あり
keys38381220258 あり
prototype38381214258 あり
set38381214258 あり
size383812192258 あり
values38381220258 あり
@@iterator あり あり あり

36

27 — 363 4

17 — 275 6

あり あり あり
@@species5151134138105.0
@@toStringTag4444 なし なし なし なし4.0

1. Returns 'undefined' instead of the 'Map' object.

2. 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.

3. A placeholder property named @@iterator is used.

4. Supported as @@iterator.

5. A placeholder property named iterator is used.

6. Supported as iterator.

関連情報

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

最終更新者: BuminMacintosh,