JavaScriptでWeakMapが必要な理由とは?弱参照の仕組みと活用シーンを解説
JavaScriptのWeakMapは、キーと値のペアを格納するコレクションの一種です。通常のMapと大きく異なる点は、「キーが弱く参照される(weakly referenced)」という特性を持つことです。キーには必ずオブジェクトを指定する必要があり、値には任意のデータを格納できます。
弱参照(Weak Reference)とは何か
Wikipediaによれば、弱参照とは、強参照とは異なり、参照先のオブジェクトをガベージコレクタによる回収から保護しない参照のことを指します。あるオブジェクトへのすべての参照チェーンに少なくとも1つの弱参照が含まれる場合、そのオブジェクトは「弱到達(weakly reachable)」とみなされます。弱到達のオブジェクトは到達不可能なものとして扱われ、いつでもガベージコレクションによってメモリから解放される可能性があります。
WeakMapが活躍するユースケース
普通のオブジェクトやMapを使うとメモリリークを引き起こしかねない場面でも、WeakMapを利用すれば問題を回避できます。代表的な活用シーンを見ていきましょう。
1. オブジェクトのプライベートデータの管理
特定のオブジェクトに関するプライベートデータを保持し、そのMapへの参照を持つ者だけがアクセスできるようにできます。外部からの不正なアクセスや改ざんを防ぎたい場合に特に有効です。
2. ライブラリオブジェクトへの非侵入的なデータ保持
ライブラリが提供するオブジェクトそのものを変更することなく、また余計なパフォーマンスオーバーヘッドを発生させることなく、それらに関するデータを保持できます。
3. 隠蔽クラス(Hidden Class)への悪影響を避ける
同一型のオブジェクトが大量に存在する環境で、一部のオブジェクト群にだけデータを持たせたい場合があります。オブジェクトに直接プロパティを追加すると、JavaScriptエンジンが最適化に利用する隠蔽クラス(hidden class)の構造が崩れ、パフォーマンス低下につながる可能性があります。WeakMapを使えば、オブジェクトの構造に触れずにこの問題を回避できます。
4. DOMノードなどホストオブジェクトへのデータ関連付け
ブラウザ環境におけるDOMノードのようなホストオブジェクトにデータを関連付けたい場合にも、WeakMapは非常に便利です。ノードがDOMから削除されて参照がなくなれば、WeakMap内のエントリも自動的に解放されるため、メモリリークの心配がありません。
5. 外部からのケイパビリティ(機能)の付与
既存のオブジェクトのコードを一切変更せずに、外部から新しい機能(ケイパビリティ)を後付けすることも可能です。
まとめ
WeakMapは、キーとして指定したオブジェクトが他の場所から参照されなくなったとき、対応するエントリを自動的にガベージコレクションの対象にできる点が最大の強みです。メモリリークを防ぎながら、オブジェクトに対して安全かつ柔軟にメタデータを紐づけたい場面で、ぜひ活用したい機能といえるでしょう。
-
JavaScriptのMap(マップ)オブジェクトとは?基本的な使い方をサンプルコード付きで解説
MapオブジェクトとはMap(マップ)オブジェクトは、ES6(ECMAScript 2015)で導入された組み込みオブジェクトの一つで、「キー」と「値」のペアで構成される要素を管理するコレクションです。通常のオブジェクトとよく似ていますが、Mapの大きな特徴は、キーにオブジェクトやプリミティブ値など、あらゆる型の値を使用できる点にあります。さらに、要素は挿入した順序で保持されるため、for...ofループなどを利用して、追加した順番どおりに反復処理を行うことも可能です。Mapオブジェクトの主なメソッドとプロパティメソッド / プロパティ説明new Map(iterable)配列などのイテラブル
-
JavaScriptのBlobオブジェクトとは?基本と使い方をわかりやすく解説
Blobオブジェクトとは Blob(Binary Large Object)オブジェクトは、不変(イミュータブル)な生データを表現するためのオブジェクトです。Blobはファイルと同じように、データのサイズを表す size プロパティと、MIMEタイプを表す type プロパティを持っています。 File オブジェクトはBlobの派生オブジェクトであるため、Fileが利用できる場面であれば、Blobもそのまま使用することが可能です。 Blobの主な用途としては、テキストやバイナリデータの生成、URL.createObjectURL() を使った一時的なURLの作成、ファイルのダウンロード処理など