ข้ามไปเนื้อหาหลัก

WeakMap & WeakSet — reference ที่ไม่กัน GC

WeakMap และ WeakSet เก็บ reference แบบ “อ่อน” — ถ้า key ไม่มี reference อื่นในโปรแกรมแล้ว garbage collector จะเก็บ object นั้นทิ้งได้โดยอัตโนมัติ ไม่ memory leak

const cache = new WeakMap();

function process(element) {
  if (cache.has(element)) return cache.get(element);
  const result = expensiveWork(element);
  cache.set(element, result);   // element ถูกลบจาก DOM → GC เก็บ result ทิ้งให้เอง
  return result;
}

WeakSet — track ว่า object ผ่าน operation ไหนแล้ว:

const visited = new WeakSet();

function visit(node) {
  if (visited.has(node)) return;
  visited.add(node);
  doWork(node);
}
// node ถูก GC ได้เมื่อไม่มีใช้งาน — visited ไม่ค้าง reference ไว้

ข้อจำกัด: key ต้องเป็น object เท่านั้น, ไม่มี .size, ไม่ iterable (by design — GC timing ไม่แน่นอน)

เมื่อไหร่ใช้: metadata/cache ที่ผูกกับ object lifecycle — เช่น DOM element metadata, private class state (ก่อน private fields #), memoization