WeakMapとWeakSet — シンプルなプライバシー保護とキャッシュ
WeakMapとWeakSetの基本を学びます。オブジェクト専用のキー、sizeや反復がないこと、プライバシー用ヘルパー、自動的に整理される小さなキャッシュを扱います。
「WeakMapとWeakSet — シンプルなプライバシー保護とキャッシュ」はCoddyKit上の無料JavaScript Academyレッスンです。 これはレッスン2/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJavaScript Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 JavaScript Academyコースには全3レッスンが含まれています。
なぜWeakコレクションなのか
目標:ガベージコレクションを妨げずに、オブジェクトへメタデータを追加します。
- WeakMap:オブジェクト → 値
- WeakSet:オブジェクトのメンバーシップ
- sizeも反復処理もありません
- プライバシー保護とキャッシュに適しています

WeakMapの基本
WeakMapのキーに指定できるのはオブジェクトだけです。set/get/has/deleteをサポートしますが、反復処理やsizeはありません。
// WeakMap: keys must be objects
const wm = new WeakMap();
const user = { name: "Ayla" };
wm.set(user, { visits: 1 });
console.log("has user?", wm.has(user));
console.log("get meta:", wm.get(user));
// Note: no wm.size, no wm.keys() — not iterable

WeakSetの基本
WeakSetはオブジェクトを保持します。重複はなく、反復処理もsizeプロパティもありません。
// WeakSet: store objects without duplicates
const ws = new WeakSet();
const obj1 = {};
const obj2 = {};
ws.add(obj1);
ws.add(obj2);
ws.add(obj1); // duplicate ignored
console.log("has obj1?", ws.has(obj1));
// Note: no ws.size and no iteration

WeakMapによるプライバシー保護
WeakMapを使うと、APIオブジェクトに非公開データを関連付けられます。APIオブジェクトがなくなると、そのデータも回収できるようになります。
// Privacy helper: store private data outside the object
const _priv = new WeakMap();
function makeCounter() {
const api = {};
_priv.set(api, { value: 0 });
api.inc = function () {
const box = _priv.get(api);
box.value = box.value + 1;
console.log("value", box.value);
};
// No public field exposes value directly
return api;
}
const c = makeCounter();
c.inc();
c.inc();
// console.log(c.value) -> undefined (nothing public)

オブジェクトごとのキャッシュ
オブジェクトごとのキャッシュを作成できます。キーとなるオブジェクトが参照されなくなると、エントリも消えます。
// Cache computed data per object without leaks
const cache = new WeakMap();
function computeLength(doc) {
// Return cached result if present
if (cache.has(doc)) {
return cache.get(doc);
}
// Fake "expensive" compute
const result = (doc.text || "").length;
cache.set(doc, result);
return result;
}
const d1 = { text: "hello" };
const d2 = { text: "world!" };
console.log("len d1:", computeLength(d1));
console.log("len d1 cached:", computeLength(d1));
console.log("len d2:", computeLength(d2));
// If d1/d2 become unreachable, their cache entries can disappear automatically

制限と使わない場合
覚えておきましょう:
- WeakMap/WeakSetでは反復処理もsizeも使えません。
- キーにはオブジェクトを指定する必要があります。
- キーの一覧表示や項目数のカウントが必要なら、Map/Setを使います。

WeakMapとMapのクイズ
簡単な確認:WeakMapの使用例です。

まとめ
まとめ:オブジェクトと値の関連付けによるプライバシー保護やキャッシュにはWeakMapを使い、メモリリークを起こさずにオブジェクトのメンバーシップを管理するにはWeakSetを使います。キーはオブジェクトだけで、反復処理やsizeは使えない点に注意してください。

よくある質問
「WeakMapとWeakSet — シンプルなプライバシー保護とキャッシュ」レッスンは無料ですか?
はい。「WeakMapとWeakSet — シンプルなプライバシー保護とキャッシュ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、JavaScript Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 JavaScript Academyコースには全3レッスンが含まれています。
「WeakMapとWeakSet — シンプルなプライバシー保護とキャッシュ」で何を学びますか?
WeakMapとWeakSetの基本を学びます。オブジェクト専用のキー、sizeや反復がないこと、プライバシー用ヘルパー、自動的に整理される小さなキャッシュを扱います。 ブラウザで直接実行するハンズオンコードでJavaScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
JavaScript Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのJavaScript Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/3です。
「WeakMapとWeakSet — シンプルなプライバシー保護とキャッシュ」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このJavaScript Academyレッスンでコードを書いて実行できますか?
はい。すべてのJavaScript Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- MapとSetの基本
- WeakMapとWeakSet — シンプルなプライバシー保護とキャッシュ
- 反復処理のパターン