

高岡智則
年齢:33歳 性別:男性 職業:Webディレクター(兼ライティング・SNS運用担当) 居住地:東京都杉並区・永福町の1LDKマンション 出身地:神奈川県川崎市 身長:176cm 体系:細身〜普通(最近ちょっとお腹が気になる) 血液型:A型 誕生日:1992年11月20日 最終学歴:明治大学・情報コミュニケーション学部卒 通勤:京王井の頭線で渋谷まで(通勤20分) 家族構成:一人暮らし、実家には両親と2歳下の妹 恋愛事情:独身。彼女は2年いない(本人は「忙しいだけ」と言い張る)
weakmapとは?
weakmap は JavaScript のデータ構造のひとつで、キーにはオブジェクトを、値には任意のデータを対応づけて管理します。覚えておきたい点は「弱い参照」をキーが持つことで、対象のオブジェクトがどこからも参照されなくなると、メモリが解放されやすくなるという性質です。
つまり WeakMap は、オブジェクトと値を結びつける「箱」のようなものですが、箱の中身をずっと大切に保つのではなく、オブジェクトが不要になれば自動的に整理してくれる役割を持っているのです。これにより、長く動き続けるアプリケーションでもメモリの無駄遣いを抑えることができます。
強い参照と弱い参照の違い
私たちが普段使う普通の Map はキーの参照が強いため、キーとなるオブジェクトがどこかで参照されていればガベージコレクションの対象になりにくくなります。一方、WeakMap のキーは「オブジェクトのみ」で、外部からそのオブジェクトへの参照がなくなると WeakMap からも解放される可能性が高くなります。これが WeakMap の最大の特徴です。
WeakMap の使いどころ
ライフサイクルを管理したい場面に向いています。例えば、UI の各要素に対して追加情報を一時的に持たせたいとき、要素が削除されたらその情報も自動的に解放されるようにしたいときなどが挙げられます。
ただし、WeakMap は キーの列挙ができない点や、サイズを取得するメソッドがない点など、Map と比べて使い勝手が劣る場面もあります。情報を一覧で表示したい場合や、長期的にデータを蓄積したい場合には Map の方が適していることが多いです。
基本的な使い方
WeakMap を使うにはまずインスタンスを作ります。次にオブジェクトをキーとして値を設定します。
let wm = new WeakMap();
let obj = {};
wm.set(obj, 'value');
このようにして obj に対して value というデータを関連付けることができます。重要なのはキーには必ずオブジェクトを使うことです。文字列や数値をキーとして使うことはできません。
値を取り出すには wm.get(obj); のようにします。もし obj が WeakMap に登録されていなければ undefined が返ります。さらに wm.has(obj); で登録の有無を確認できます。削除する場合は wm.delete(obj); を使います。
Map との違いを表で比較
| 項目 | Map | WeakMap |
|---|---|---|
| キーの型 | 任意の値 | オブジェクトのみ |
| 参照の扱い | 強い参照 | 弱い参照 |
| ガベージコレクション時の動作 | オブジェクトが解放されても参照が残ることがある | オブジェクトが解放されると参照は自動的に消える |
| 主な用途 | データの結びつきやキャッシュなど幅広い用途 | 一時的なデータの関連付けやオブジェクトのライフサイクル追跡 |
よくある誤解と注意点
WeakMap は強くオブジェクトを保持しないため、オブジェクトを確実に覚えておきたい場合には適していません。キーの列挙ができない点も覚えておきましょう。つまり、WeakMap には現在登録されているキーのリストを取得する方法は基本的には用意されていません。その代わり、対象オブジェクトが不要になったときに自動的に解放される性質を活かす使い方が有効です。
まとめ
本記事では weakmap の基本を中学生にも分かる言葉で解説しました。弱い参照という概念を理解すると、オブジェクトのライフサイクルに応じたデータ管理ができるようになります。キーにはオブジェクトのみを使い、ガベージコレクションを意識した使い方を心がけましょう。Map との違いを頭の中で整理しておくと、適切な場面で適切なデータ構造を選べるようになります。
weakmapの同意語
- WeakMap
- JavaScriptの組み込みコレクションの1つ。キーはオブジェクトのみを参照として保持し、値は任意の型。キーへの参照は弱く保持されるため、該当オブジェクトが他に参照されなくなるとエントリが自動的に削除される可能性がある。
- Weak Map
- WeakMap のスペース入り表記。場面に応じてこの表記が使われることがある。
- 弱い参照マップ
- WeakMap の日本語訳表現のひとつ。キーはオブジェクトのみを参照し、エントリは弱い参照で管理されるマップ。
- 弱参照マップ
- WeakMap の直訳寄りの日本語表現。キーはオブジェクトのみで、ガベージコレクタによりエントリが削除され得るマップ。
- ウェークマップ
- WeakMap のカタカナ表記。技術記事などで見られる表記。
- WeakMap(ウェークマップ)
- WeakMap の正式名とカタカナ表記を併記した表現。どちらの表現も同じ機能を指す。
- 弱い参照付きマップ
- キーの参照が弱く保持され、不要になればエントリが削除され得るマップという意味合いの表現。
- 弱い参照を用いるマップ
- キーを弱い参照として保持することで、対象オブジェクトが不要になった際にエントリが解放されやすいマップという説明表現。
weakmapの対義語・反対語
- 通常のMap
- WeakMapの対義語として最も近い概念。Mapはキーとしてオブジェクトだけでなく任意の値を許容し、キーを強い参照で保持します。そのためガベージコレクションの対象となるかどうかは参照の寿命に強く左右され、WeakMapのような自動的な解放は基本的に発生しません。
- 強参照マップ
- WeakMapと対になる考え方のマップ。キーを強い参照で保持するため、対応するオブジェクトが不要になっても自動的には解放されません。通常はMapと同様の利用を想定します。
- 従来のオブジェクト連想配列
- 文字列キーを用いる典型的な連想配列。オブジェクトをキーとして使うことはできず、キーは常に強い参照で保持されるためガベージコレクションの影響を受けにくい一方で、WeakMapのような弱参照の性質はありません。
- WeakSet(補足的な対比)
- WeakMapの“弱参照”の考え方を拡張した概念として、弱い参照を持つ集合の例。WeakSetは値を弱い参照で保持するため、参照がなくなると要素が自動的に解放されやすい点が特徴です。WeakMapの対極にある弱参照の扱いを知る入門として有用です。
weakmapの共起語
- WeakMap
- WeakMap は、キーにオブジェクトを使い、対応する値を格納するコレクションです。エントリはガーベージコレクションの対象となる可能性があり、オブジェクトが生きている限りだけ値を保持します。
- Mapとの違い
- Map は任意の値をキーにできる強参照のコレクションですが、WeakMap はキーがオブジェクトのみで、エントリは列挙できない点が大きな違いです。
- キーはオブジェクトのみ
- WeakMap のキーは原則としてオブジェクトでなければなりません。プリミティブ値は使えません。
- 列挙不可
- WeakMap には for...of や keys/values/entries のような列挙機能がなく、全エントリを走査することはできません。
- 基本メソッド: set/get/has/delete
- エントリの追加は set、取得は get、存在確認は has、削除は delete が使われます。
- ガベージコレクション
- キーとなるオブジェクトへの他の参照がなくなると、そのエントリは GC の対象となり得ます。結果として自動的に解放されやすいです。
- メモリリーク対策
- WeakMap を適切に使えば、長期的な参照を避けてメモリ使用量を抑える助けになります。
- DOMノードの紐付け
- DOM 要素などのオブジェクトと補助データを結びつけるのに便利で、要素のライフサイクルとともに管理できます。
- プライベートデータの格納
- 公開 API とは別に、オブジェクトに関連するデータを隠して管理する手段として用いられることがあります。
- イベントリスナーの管理
- 特定の要素とイベントハンドラの対応を WeakMap で管理する設計が取られることがあります。
- TypeScript対応
- TypeScript でも問題なく利用可能で、型システムと組み合わせて安全に使えます。
- ES6/ES2015導入
- WeakMap は ES2015 で標準化されたコレクションのひとつです。
- キャッシュ用途
- 短期間の紐付けやデータのキャッシュとして用いられることがありますが、全てのケースに適しているわけではありません。
- プリミティブキー不可
- 文字列や数値などのプリミティブ値をキーにできない点には注意が必要です。
- 弱参照
- WeakMap のエントリはキーの参照が弱い(強参照ではない)ため、ガーベージコレクションの影響を受けやすいです。
- サイズ情報がない
- WeakMap にはサイズを取得するプロパティはなく、現在のエントリ数を知ることはできません。
weakmapの関連用語
- WeakMap
- WeakMap はキーをオブジェクトのみとし、値を対応付けて管理するコレクションです。キーへの参照が弱く、ガベージコレクションの対象になりやすい点が特徴です。
- Map
- Map はキーと値をペアで管理する一般的なコレクションです。WeakMap とは異なり、キーは強参照を受け、プリミティブなキーも使えます。
- WeakSet
- WeakSet はオブジェクトだけを要素として持つ集合で、要素への参照は弱く管理されます。WeakMap の考え方を集合に適用したものです。
- WeakRef
- WeakRef はオブジェクトへの弱い参照を作る仕組みです。参照が弱いため、ガベージコレクションの対象になりやすく、キャッシュ的な使い方で活用します。
- ガベージコレクション
- JavaScript エンジンが不要になったオブジェクトを自動的に回収してメモリを解放する仕組みです。WeakMap のエントリは GC の対象になることがあります。
- 参照の種類
- 強参照と弱参照の違いを理解すると、WeakMap の挙動がわかりやすくなります。弱参照は GC の対象になりやすい特性があります。
- キーはオブジェクトのみ
- WeakMap のキーにはオブジェクトしか使えません。プリミティブ値は許されません。
- プライベートデータ
- WeakMap を使うと、クラスのインスタンスに対する秘密データを外部から見えないように紐付けられ、プライベート感を演出できます。
- get / set / has / delete
- WeakMap の要素を操作する基本メソッドです。キーはオブジェクト、対応する値を取得・設定・存在確認・削除します。
- 互換性
- 主要なブラウザと Node.js で広くサポートされていますが、古い環境では未対応のこともあるため環境確認が大切です。
- 実装上の注意
- WeakMap は弱参照の性質上、キーオブジェクトが他の参照から解放されるとエントリが自動的に削除されます。サイズの取得はできません。
- 使い方パターン
- クラスのプライベートデータの管理、メタデータの紐付け、イベントリスナの管理など、外部から直接アクセスさせたくないデータの保持に適しています。



















