WeakMapから要素を削除する際に使用する`delete()`メソッドについて、使い方や注意点を解説します。

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

WeakMapから特定の要素を削除するには、`delete()`メソッドを使用します。このメソッドは引数にキーを指定し、削除に成功した場合は`true`、失敗した場合は`false`を返します。

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

weakMap.set(key, 'value');
console.log(weakMap.has(key)); // true

const result = weakMap.delete(key);
console.log(result); // true
console.log(weakMap.has(key)); // false

delete()メソッドの戻り値について

delete()メソッドは以下のような戻り値を返します:

  • 削除成功時:`true`
  • キーが存在しない場合:`false`
const weakMap = new WeakMap();
const key = {};
const nonExistentKey = {};

weakMap.set(key, 'value');

console.log(weakMap.delete(key)); // true(存在するキーの削除)
console.log(weakMap.delete(nonExistentKey)); // false(存在しないキーの削除)

注意点とよくあるエラー

1. プリミティブ値をキーとして使用できない

WeakMapのキーはオブジェクトである必要があります。文字列や数値などのプリミティブ値は使用できません。

const weakMap = new WeakMap();

// エラーになる例
weakMap.set("string", "value"); // TypeError
weakMap.delete("string"); // false

// 正しい例
const objKey = {};
weakMap.set(objKey, "value");
weakMap.delete(objKey); // true

2. キーの参照を失わないように注意

WeakMapのキーはガベージコレクションの対象となるため、キーの参照を保持しておく必要があります。

const weakMap = new WeakMap();

// 参照を失うパターン
weakMap.set({}, "value");
// この時点で{}への参照が失われ、ガベージコレクションの対象になる

// 正しいパターン
const key = {};
weakMap.set(key, "value");
weakMap.delete(key);

実践的な使用例

メモリ管理を考慮したオブジェクトのメタデータ管理:

const weakMap = new WeakMap();

class User {
  constructor(name) {
    this.name = name;
  }
}

function addUserMetadata(user, metadata) {
  weakMap.set(user, metadata);
}

function removeUserMetadata(user) {
  return weakMap.delete(user);
}

const user = new User("John");
addUserMetadata(user, { lastLogin: new Date() });

// メタデータの削除
console.log(removeUserMetadata(user)); // true

まとめ

WeakMapの`delete()`メソッドは:

  • キーを指定して要素を削除できる
  • 削除の成功・失敗をブール値で返す
  • キーはオブジェクトである必要がある
  • メモリ管理を意識したプログラミングに適している

これらの特徴を理解し、適切に使用することで、効率的なメモリ管理とデータ操作が可能になります。