WeakMapのhas()メソッドを使って、指定したキーがWeakMap内に存在するかどうかを確認する方法を解説します。

WeakMap.has()メソッドの基本的な使い方

has()メソッドは、WeakMapに特定のキーが存在する場合は`true`を、存在しない場合は`false`を返します。

const weakMap = new WeakMap();
const key = {};

weakMap.set(key, 'value');

console.log(weakMap.has(key)); // true
console.log(weakMap.has({}));  // false

実践的な使用例

以下は、オブジェクトの参照を追跡する例です:

const weakMap = new WeakMap();
const user1 = { id: 1, name: 'John' };
const user2 = { id: 2, name: 'Jane' };

// ユーザーオブジェクトを追跡
weakMap.set(user1, 'active');
weakMap.set(user2, 'inactive');

// ユーザーの存在確認
if (weakMap.has(user1)) {
    console.log('User1は追跡されています');
}

if (!weakMap.has({ id: 3 })) {
    console.log('存在しないユーザーです');
}

注意点

1. WeakMapのキーは必ずオブジェクトである必要があります。プリミティブ値をキーとして使用するとエラーが発生します。

const weakMap = new WeakMap();

// これらはエラーになります
weakMap.set(1, 'value');        // TypeError
weakMap.set('key', 'value');    // TypeError
weakMap.set(null, 'value');     // TypeError

2. オブジェクトの参照が同じでない限り、同じ内容のオブジェクトでも別のキーとして扱われます。

const weakMap = new WeakMap();
const obj1 = { id: 1 };
weakMap.set(obj1, 'value');

console.log(weakMap.has(obj1));     // true
console.log(weakMap.has({ id: 1 })); // false(異なるオブジェクト参照)

メモリ管理の特徴

WeakMapの特徴として、キーとして使用されているオブジェクトへの参照が他に存在しなくなると、そのエントリは自動的にガベージコレクションの対象となります。

let obj = { id: 1 };
const weakMap = new WeakMap();
weakMap.set(obj, 'data');

console.log(weakMap.has(obj)); // true

obj = null; // objへの参照を解放
// この時点で、WeakMap内のエントリもガベージコレクションの対象となる

まとめ

WeakMap.has()メソッドは、WeakMap内のキーの存在確認に便利な機能です。メモリリークを防ぎながらオブジェクトの追跡が必要な場合に特に有用です。ただし、キーとしてオブジェクトのみを使用できる点と、オブジェクトの参照の同一性に注意する必要があります。