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.
WeakMap はキーと値の組の集合ですが、キーはオブジェクトまたは非登録シンボルでなければならず、値は任意の JavaScript 型で、キーへの強い参照を生成しません。つまり、WeakMap 内のキーとしてのオブジェクトが存在しても、そのオブジェクトがガベージコレクションされる可能性があります。キーとして使用されたオブジェクトが回収されると、そのオブジェクトに対応する値は、他の場所で強く参照されていない限り、どの WeakMap においても同様にガベージコレクションの対象となります。WeakMap のキーとして使用することができる唯一のプリミティブ型はシンボル(正確に言えば、非登録シンボル)です。非登録シンボルは一意性が保証され、再生成されないためです。
WeakMapは、値がキーを参照している場合でも、キーとなるオブジェクトがガベージコレクションされるのを妨げない方法で、データとオブジェクトを関連付けることができます。ただし、WeakMapはキーの生存状態を監視できないため、列挙をすることができません。WeakMap がキーを列挙するメソッドを公開した場合、そのリストはガベージコレクションの状態に依存するため、不確定性が生じます。キーの列挙を行いたいのであれば、WeakMap ではなく Map を使用してください。
WeakMap について詳しく知るには、 WeakMap オブジェクトのガイド(キー付きコレクション内)を参照してください。
WeakMap のキーはガベージコレクション可能でなければなりません。ほとんどのプリミティブデータ型は任意に作成でき、寿命を持たないため、キーとして使用できません。オブジェクトと非登録シンボルは、ガベージコレクション可能であるためキーとして使用できます。
通常の Map と同様に、値の等価性は SameValueZero アルゴリズムに基づきます。これは === 演算子と同じです。WeakMap がオブジェクトとシンボルのキーしか保持できないためです。つまり、オブジェクトキーの場合、等価性はオブジェクトが同一のものであるかに基づきます。これらは値ではなく参照によって比較されます。
マップ API は、4 つの API メソッドで共有される 2 つの配列(1 つはキー用、もう 1 つは値用)を用いることで、JavaScript に実装することができました。このマップに要素を設定すると、それぞれの配列の最後に同時にキーと値を追加することになります。その結果、両方の配列でキーと値のインデックスは対応がとれています。マップから値を取得するには、すべてのキーを操作して一致するものを見つけ、見つかったキーのインデックスを使用して値の配列から対応する値を取り出します。
そうした実装では、主に 2 つの不都合が生じることとなります。
これに対し、WeakMap では、キーオブジェクトは、そのキーがガベージコレクションされない限り、そのコンテンツに対して強く参照しますが、その後は弱く参照します。したがって、WeakMap は次のように動作します。
WeakMap は、キーがガベージコレクションされていない場合にのみ有益な、キーに関する情報をキーに割り当てる際に特に有益なデータ構造です。
しかし、WeakMapはキーの生存状態を監視できないため、キーは列挙可能ではありません。キーのリストを取得するメソッドは存在しません。仮に存在した場合、そのリストはガベージコレクションの状態に依存し、不確定性が生じることになります。キーのリストが必要な場合は、 Map を使用してください。
新しい WeakMap オブジェクトを生成します。
これらのプロパティは WeakMap.prototype に定義され、すべての WeakMap インスタンスで共有されます。
WeakMap.prototype.constructorこのインスタンスオブジェクトを作成したコンストラクター関数。WeakMap インスタンスの場合、初期値は WeakMap コンストラクターです。
WeakMap.prototype[Symbol.toStringTag][Symbol.toStringTag] プロパティの初期値は文字列 "WeakMap" です。このプロパティは Object.prototype.toString() で使用されます。
key に関連した値を削除します。その後 WeakMap.prototype.has(key) は false を返します。
WeakMap.prototype.get()key に関連した値を返します。見つからない場合、undefined を返します。
WeakMap.prototype.getOrInsert()この WeakMap 内で指定されたキーに対応する値を返します。キーが存在しない場合、指定されたデフォルト値を持つ新しい項目を挿入し、挿入された値を返します。
WeakMap.prototype.getOrInsertComputed()この WeakMap で指定されたキーに対応する値を返します。キーが存在しない場合、指定されたキーと、与えられたコールバックから計算されたデフォルト値を持つ新しい項目を挿入し、挿入された値を返します。
WeakMap.prototype.has()この WeakMap オブジェクト内に、指定されたキーに関連付けられた値があるかどうか示す論理値を返します。
WeakMap.prototype.set()この WeakMap オブジェクト内に、指定されたキーと値を持つ新しい項目を追加します。すでにそのキーが存在する場合は、既存の項目を更新します。
開発者はWeakMapを使用してオブジェクトにプライベートデータを関連付けることができ、これには次のような利点があります。
これは、プライベートフィールドを使用した次のコードとほぼ同等です。
WeakMapは、オブジェクト自体の存続期間に影響を与えずに、オブジェクトにメタデータを関連付けるために使用できます。これはプライベートメンバーの例と非常に似ています。プライベートメンバーもまた、プロトタイプ継承に参加しない外部メタデータとしてモデル化されるためです。
この使い方は、既に生成されたオブジェクトにも拡張できます。例えば、ウェブ上では、DOM 要素に追加データを関連付け、後でその DOM 要素がアクセスできるようにしたい場合があります。一般的な手法は、データをプロパティとして添付することです。
このアプローチは有効ですが、いくつか落とし穴があります。
WeakMap を使用してこれらを修正してみます。
ここでは、clicked にアクセスできるコードのみがそれぞれのボタンのクリック状態を把握しており、外部コードは状態を変更できません。さらに、いずれかのボタンが DOM から除去されると、関連付けられたメタデータは自動的にガベージコレクションの対象となります。
関数に渡されたオブジェクトを関数の結果に関連付けることができます。これにより、同じオブジェクトが再度渡された場合、関数を再実行せずにキャッシュされた結果を返すことが可能です。この機能は、関数が純粋(つまり、外部オブジェクトを変更したり他の観測可能な副作用を引き起こしたりしない)である場合に有用です。
この方法は、関数の入力がオブジェクトである場合にのみ有効です。さらに、入力が二度と渡されなくても、キー(入力)が存続している限り、結果はキャッシュに永久に残ります。より効果的な方法は、Map と WeakRef オブジェクトを組み合わせて使用することです。これにより、あらゆる型の入力値を、それに対応する(潜在的に大規模な)計算結果に関連付けることができるようになります。詳細は WeakRef と FinalizationRegistry の例を参照してください。
| ECMAScript® 2027 Language Specification # sec-weakmap-objects |
Enable JavaScript to view this browser compatibility table.
This page was last modified on 2026年1月22日 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.