Circular reference: 2 object tham chiếu lẫn nhau (A→B, B→A).
Ví dụ kinh điển
let dog = new Dog(); let person = new Person(); dog.owner = person; person.pet = dog; // circular
Phân tích
- Trình duyệt cũ (ref-counting GC): gây memory leak.
- GC hiện đại (mark-and-sweep): **không leak**, xử lý chu trình tốt.
- Thiết kế: **code smell** — tight coupling, khó test, khó serialize (
JSON.stringifylỗi).
Giải pháp
- Giữ 1 chiều (owner HOẶC pet), tra ngược qua ID/Map khi cần.
- Dùng
WeakMapcho mapping ngược (không cản GC). - Nếu bắt buộc 2 chiều — chấp nhận, document rõ ràng.