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