Get to know MDN better
このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。
This feature is well established and works across many devices and browser versions. It’s been available across browsers since 2015年7月.
* Some parts of this feature may have varying levels of support.
Map オブジェクトはキーと値のペアを保持し、キーが最初に挿入された順序を覚えています。 キーや値には任意の値(オブジェクトとプリミティブ値)を使用することができます。
Map オブジェクトは、キーと値のペアのコレクションです。Map のキーは一度しか出現しません。Map の集合の中で一意です。Map オブジェクトはキーと値のペアで反復処理されます。for...of ループは、各反復処理に対して [キー, 値] という 2 つのメンバーからなる配列を返します。反復処理は 挿入順 で行われます。これは、それぞれのキーと値のペアが set() メソッドによって最初にマップに挿入された順番に対応します(つまり、 set() が呼ばれたときには、すでに同じ値を持つキーがマップになかったということです)。
仕様書では、「平均して、集合の要素数に対してサブリニアなアクセス時刻を提供する」マップを実装することを要求しています。したがって、複雑度が O(N) よりも高い場合、内部的にはハッシュ表(O(1) ルックアップ)、探索木(O(log(N)) ルックアップ)、あるいは他のデータ構造として表すことが可能です。
キー値の等価性は SameValueZero アルゴリズムに基づいて評価されます。(以前は SameValue が使われており、 0 と -0 が異なるものとして扱われていました。ブラウザーの互換性をチェックしてください)。これは NaN を NaN と等価と見なすもので(NaN !== NaN ですが)、他の値はすべて === 演算子の意味に従って等価性が考慮されます。
Object と Map は似ています。どちらもキーを値に設定したり、それらの値を受け取ったり、キーを削除したり、キーに何かが格納されているかどうかを判定したりすることができます。この意味で(そして他の組み込みオブジェクトがなかったため)、従来 Object は Map として使われてきました。
しかし、いくつかの場面で Map の方が勝るような重要な違いがあります。
| Map は既定では何もキーを持っていません。明示的に設定したものだけを含みます。 |
Object にはプロトタイプがあります。よって既定のキーを含んでいるので、注意しないと自分のキーと衝突する可能性があります。 メモ: ES5 では、 Object.create(null) を使用すると回避できますが、これはめったに行われていません。 |
| Map はユーザーが提供したキーと値を使用しても安全です。 |
ユーザーが提供したキーと値のペアを Object に設定すると、攻撃者がオブジェクトのプロトタイプを上書きできる可能性があり、 オブジェクトインジェクション攻撃 につながる可能性があります。偶発的なキーの問題と同様に、これもnull-prototypeオブジェクトを使用することによって軽減することができます。 |
| Map のキーはあらゆる値がなることができます (関数、オブジェクト、あらゆるプリミティブなど)。 | Object のキーは文字列またはシンボルでなければなりません。 |
|
Map のキーは、直感的な方法で順序付けられます。すなわち、反復処理を行うと、 Map オブジェクトは挿入順でキーを返します。 |
通常の Object のキーは現在では順序付けされていますが、以前はそうではなかったので、順序は複雑です。結果として、プロパティの順序に頼らない方が良いでしょう。 この順序は ECMAScript 2015 で初めて自身のプロパティに対してのみ定義されましたが、 ECMAScript 2020 では継承されたプロパティに対しても同様に順序が定義されています。 しかし、オブジェクトのプロパティがすべて反復処理される単一の単一のメカニズムはないことに注意してください。 (for-in は列挙可能な文字列キーのプロパティのみを含む、 Object.keys は自分自身の列挙可能な文字列キーのプロパティのみを含む、 Object.getOwnPropertyNames は列挙不可能な場合でも自分自身の文字列キーのプロパティを含む、 Object.getOwnPropertySymbols は、 Symbol キーを持つプロパティに対しても同じことを行う、など。) |
| Map の中のアイテム数は、 size プロパティで簡単に得ることができます。 | Object 内のアイテムの数を決定することは、より回りくどく、効率的ではありません。一般的な方法は、 Object.keys() から返される配列の length を通じて行う方法です。 |
| Map は 反復可能 ですので、直接反復処理を行うことができます。 |
Object
では反復処理を行うのに、いくつかの形でキーの一覧を取得して、そのうえで反復処理を行う必要があります。
Object は 反復処理プロトコルを実装していないので、オブジェクトを JavaScript の for...of 文を使用して直接反復処理を行うことは(既定では)できません。 メモ:
|
|
キーと値のペアを頻繁に追加したり削除したりすることが求められる場面では、性能がより良くなります。 |
キーと値のペアを頻繁に追加したり削除したりすることに最適化されていません。 |
|
シリアライズや解釈のためのネイティブな対応はありません。 (ただし、 replacer 引数で JSON.stringify() を使用し、 reviver 引数で JSON.parse() を使用することで、 Map のために、独自のシリアライズと解釈の対応を作成することができます。 Stack Overflow の質問 How do you JSON.stringify an ES6 Map? を参照してください。) |
Object から JSON へのシリアライズには、 JSON.stringify() を使用してネイティブに対応しています。 JSON から Object への解釈には、 JSON.parse() を使用してネイティブに対応しています。 |
Map オブジェクトに対してオブジェクトプロパティを設定すると正しく動作しますが、混乱を催すことが考えられます。
たとえば、次の例は一応動作するように見えます。
しかし、このようにプロパティを設定すると、 Map データ構造を使用しません。一般的なオブジェクトの機能を使用します。 'bla' の値はクエリーを行うための Map に格納されません。データにその他の操作を行うと失敗します。
Map にデータを格納する正しい方法は、 set(key, value) メソッドを使用する方法です。
ブラウザーの Map 風オブジェクト (または「Map 風オブジェクト」) は、多くの点で Map のようにふるまう Web API のインターフェイスです。
Map と同様に、項目はオブジェクトに追加されたのと同じ順番で走査できます。 また、Map 風オブジェクトと Map は同じ名前で同じ挙動のプロパティおよびメソッドを持ちます。 しかし、Map と違い、各項目のキーと値には事前に定義された特定の型しか使用できません。
使用可能な型は、仕様書の IDL 定義で設定されています。 たとえば、RTCStatsReport はキーには文字列を、値にはオブジェクトを用いなければならない Map 風オブジェクトです。 これは、仕様書の IDL で以下のように定義されています。
Map 風オブジェクトは読み取り専用のことも、読み書き可能なこともあります。(上の IDL の readonly キーワードに注目してください)
これらのメソッドとプロパティは、キーと値の型の制約を除いて、Map の対応するエンティティと同様にふるまいます。
以下は、読み取り専用の Map 風ブラウザーオブジェクトの例です。
新しい Map オブジェクトを生成します。
派生クラスを生成するためのコンストラクター関数です。
与えられた反復可能な要素を、与えられたコールバック関数から返された値を使用してグループ化します。最後に返される Map は、テスト関数から得られた一意の値をキーとして使用しており、各グループの要素の配列を取得するために使用できます。
これらのプロパティは Map.prototype で定義され、すべての Map インスタンスで共有されます。
Map.prototype.constructorこのインスタンスオブジェクトを作成したコンストラクター関数。Map インスタンスの場合、初期値は Map コンストラクターです。
Map.prototype.sizeMap オブジェクトの中のキーと値のペアの数を返します。
Map.prototype[Symbol.toStringTag][Symbol.toStringTag] プロパティの初期値は文字列 "Map" です。このプロパティは Object.prototype.toString() で使用されます。
Map オブジェクトからすべてのキーと値のペアを削除します。
Map.prototype.delete()Map オブジェクトに要素が存在し、削除された場合は true を返します。要素が存在しなければ false を返します。その後では Map.has(key) が false を返すようになります。
Map.prototype.entries()Map オブジェクトの各要素の [key, value] からなる 2 つの要素の配列を挿入順で含む新しいイテレーターオブジェクトを返します。
Map.prototype.forEach()Map オブジェクトに存在するキーと値のペアの数だけ、挿入順に callbackFn を呼び出します。 thisArg 引数が forEach に渡された場合、各コールバックの this 値として使用されます。
Map.prototype.get()key で指定されたキーに結び付けられた値を返します。存在しない場合は undefined を返します。
Map.prototype.has()論理値で、渡されたキーに結び付けられた要素が Map オブジェクト内に存在するかどうかを返します。
Map.prototype.keys()Map オブジェクト内の各要素のキーが挿入順で含む、新しいイテレーターオブジェクトを返します。
Map.prototype.set()Map オブジェクト内の渡されたキーを値に設定します。その Map オブジェクトを返します。
Map.prototype.values()Map オブジェクト内の各要素の値が挿入順で含む、新しいイテレーターオブジェクトを返します。
Map.prototype[Symbol.iterator]()Map オブジェクト内の各要素の [key, value] の配列 が挿入順で含む、新しいイテレーターオブジェクトを返します。
NaN もまたキーとして使うことができます。すべての NaN は自身と等しくない(NaN !== NaN は真)にもかかわらず、以下の例は動作します。これは NaN が互いに区別できないためです。
マップは for..of ループを使用して反復処理を行うことができます。
マップは forEach() メソッドを使用して反復できます。
Array と同様に、 Map は複製することができます。
メモ: データ自身は複製されないことに注意しておいてください。言い換えれば、これは Map のシャローコピーにすぎません。
マップはキーの固有性を保持しながら混合可能です。
Map は Array と混合することもできます。
| ECMAScript® 2027 Language Specification # sec-map-objects |
Enable JavaScript to view this browser compatibility table.
This page was last modified on 2025年8月18日 by MDN contributors.
Your blueprint for a better internet.
Visit Mozilla Corporation’s not-for-profit parent, the Mozilla Foundation.
Portions of this content are ©1998–2026 by individual mozilla.org contributors. Content available under a Creative Commons license.