JavaScriptで、オブジェクトのインスタンスをキーとして値を紐付け、そのオブジェクトが同一参照であれば値を取得できるデータ構造はどれか。
解説
Mapはキーに任意の型を使えるコレクションで、オブジェクト参照をそのままキーとして扱えます。通常のObjectはキーを内部で文字列に変換するため、異なるオブジェクトを渡しても[object Object]という同じ文字列キーに衝突してしまいます。Setはキーと値のペアではなく値の集合なので、値の紐付けには使えません。配列にペアをpushする方法は動作こそしますが、取得時に線形探索(O(n))になるため、Mapのようなハッシュベースの高速な検索(O(1))は期待できません。ObjectのキーとMapのキーは何が違うのかこの違いは実際にコードで見ると明確です。const obj = {}; const keyA = { id: 1 }; const keyB = { id: 2 }; obj[keyA] = 'Alice'; obj[keyB] = 'Bob'; // どちらも '[object Object]' に変換されるため上書きされる console.log(obj[keyA]); // 'Bob' console.log(Object.keys(obj)); // ['[object Object]'] const map = new Map(); map.set(keyA, 'Alice'); map.set(keyB, 'Bob'); // 参照が異なるので別のキーとして扱われる console.log(map.get(keyA)); // 'Alice' console.log(map.get(keyB)); // 'Bob' console.log(map.size); // 2Mapが適しているケースDOMノードにメタ情報を紐付ける: DOM要素をキーにしてイベント管理やキャッシュデータを保持するパターン。ただしDOM要素の解放とともにデータも消したい場合はWeakMapのほうが適切(WeakMapはキーへの参照が弱参照のため、GCの対象になる)頻繁に追加・削除を行う動的なキーバリューストア: Objectはプロパティの追加・削除が最適化されておらず、Mapはこの用途に特化して設計されている挿入順序を保証したい場合: Mapはfor...ofで挿入順にイテレートできる。Objectのキー順序はES2015以降おおむね保証されているが、整数キーが先に来るなどの例外がある