この記事は編集レビューを必要としています。ぜひご協力ください

この翻訳は不完全です。英語から この記事を翻訳 してください。

これは Harmony(ECMAScript 6) 提案の一部であり、実験段階の技術です。
この技術の仕様は安定していません。ブラウザ互換性の一覧表を確認してください。またこれらの構文や動作は、仕様変更などにより、新しいバージョンのブラウザでは変更される可能性があるという点に注意してください。

概要

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

構文

new Map([iterable])

引数

iterable
要素がキー・値の対(2 要素の配列)である Array または他の反復処理可能なオブジェクトです。それぞれのキー・値対が新しい Map に追加されます。

解説

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

キーの等価性

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

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

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

  • Object はプロトタイプを持つため、既定のキーがマップ中に存在します。しかし、これは map = Object.create(null) を使うことで回避することができます。
  • Object のキーは String ですが、Map では任意の値がキーとなり得ます。
  • Map の大きさは簡単に得ることができます。一方、Object の大きさは手動で記録する必要があります。

これはMapをいつも使えばいいということではありません。オブジェクトはまだ多くの場面で使えます。Mapインスタンスはコレクションとして使う場合のみに役に立ちます。以前オブジェクトをこのように使っていたコードにMapを使うことを考えてみるべきです。オブジェクトはメンバ変数とメソッドを備えたレコードとして使われます。もしまだどちらを使えばいいかわからないなら、以下の質問に答えてみてください。

  • キーがいつも実行時までわからない、またはキーを直接調べる必要がありますか?
  • すべての値が同じ型で、交換して使用できますか?
  • 文字列でないキーが必要ですか?
  • キーと値のペアを時々、追加または削除しますか?
  • 簡単に量が変わるキーと値のペアがありますか?
  • そのコレクションをイテレートしますか?

これらはあなたがMapをコレクションとして使いたいときのサインです。もし対照的に、固定された量のキーがあり、それら個々に操作し、Mapの使い方と区別する場合、オブジェクトを使いましょう。

プロパティ

Map.length
lengthプロパティの値は0です。
get Map[@@species]
The constructor function that is used to create derived objects.
Map.prototype
Represents the prototype for the Map constructor. Allows the addition of properties to all Map objects.

Map インスタンス

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

プロパティ

メソッド

Map オブジェクトの使用

var myMap = new Map();

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

// 値を設定する
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) {
  alert(key + " = " + value);
}
// 2 回警告を表示する。最初は "0 = zero" で 2 回目は "1 = one"

for (var key of myMap.keys()) {
  alert(key);
}
// 2 回警告を表示する。最初は "0" で 2 回目は "1"

for (var value of myMap.values()) {
  alert(value);
}
// 2 回警告を表示する。最初は "zero" で 2 回目は "one"

for (var [key, value] of myMap.entries()) {
  alert(key + " = " + value);
}
// 2 回警告を表示する。最初は "0 = zero" で 2 回目は "1 = one"

myMap.forEach(function(value, key, myMap) {
  alert(key + " = " + value);
})
// 2 回警告を表示する。最初は "0 = zero" で 2 回目は "1 = one"

Array オブジェクトとの関係

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

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

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

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

// あるいは展開演算子をキーまたは値のイテレータに使って、キーまたは値のみの配列を得る
alert(uneval([...myMap.keys()])); // Will show ["key1", "key2"]

標準仕様

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

ブラウザ互換性

機能 Chrome Firefox (Gecko) Internet Explorer Opera Safari
基本サポート

31 [1]
38

13 (13) 11 未サポート 7.1
コンストラクタ引数:new Map(iterable) 38 13 (13) 未サポート 未サポート 未サポート
反復処理可能 38 17 (17) 未サポート 未サポート 7.1
Map.clear() 31 [1]
38
19 (19) 11 未サポート 7.1
Map.keys(), Map.values(), Map.entries() 37 [1]
38
20 (20) 未サポート 未サポート 7.1
Map.forEach() 36 [1]
38
25 (25) 11 未サポート 7.1
-0 と 0 のキー等価性 34 [1]
38
29 (29) 未サポート 未サポート 未サポート
機能 Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
基本サポート 未サポート 31 [1]
38
13.0 (13) 未サポート 未サポート iOS 8
コンストラクタ引数:new Map(iterable) 未サポート 38 13.0 (13) 未サポート 未サポート 未サポート
反復処理可能 未サポート 未サポート 17.0 (17) 未サポート 未サポート iOS 8
Map.clear() 未サポート 31 [1]
38
19.0 (19) 未サポート 未サポート iOS 8
Map.keys(), Map.values(), Map.entries() 未サポート 37 [1]
38
20.0 (20) 未サポート 未サポート iOS 8
Map.forEach() 未サポート 36 [1]
38
25.0 (25) 未サポート 未サポート iOS 8
-0 と 0 のキー等価性 未サポート 34 [1]
38
29.0 (29) 未サポート 未サポート 未サポート

[1] 設定により使用可能です。chrome://flags において「JavaScript の試験運用機能を有効にする」エントリーを有効化します。

関連情報

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

 このページの貢献者: PandaNoir, lv7777, Hixhi, ocha
 最終更新者: PandaNoir,