Senior #map#set#weakmap#weakref#memory
Map, Set, WeakMap, WeakSet và WeakRef khác nhau thế nào?
⚡ Trả lời nhanh
`Map`/`Set` giữ thứ tự chèn, key là bất kỳ kiểu nào (so sánh SameValueZero). `WeakMap`/`WeakSet` chỉ nhận object làm key, giữ tham chiếu yếu nên không cản GC, không iterate được, không có `size`. `WeakRef` giữ tham chiếu yếu tới một object, `deref()` có thể trả undefined.
Ví dụ
main.js · sửa được
| Map | WeakMap | |
|---|---|---|
| Kiểu key | bất kỳ | object (và symbol không đăng ký) |
| Giữ key sống | có | không (weak) |
Iterate / size | có | không |
| Use case | cache, đếm, key phức tạp | metadata gắn với object, private data |
- WeakMap phù hợp lưu dữ liệu phụ cho object (cache theo DOM node) mà không gây memory leak: object bị GC thì entry biến mất.
- WeakRef +
FinalizationRegistrydùng cho cache lớn có thể bị thu hồi; thời điểm GC không xác định nên không dựa vào chúng cho logic đúng sai. - Khác
Object:Mapkhông có key thừa kế từ prototype, key không bị ép thành string,sizeO(1), tối ưu cho thêm/xóa thường xuyên.