Khác nhau ở kiểu key và quan hệ với garbage collector.
javascript
const map = new Map()
map.set('a', 1)
map.set(42, 2)
map.set({ id: 1 }, 3) // key kiểu nào cũng được
map.size // 3
[...map.keys()] // duyệt được
const wm = new WeakMap()
wm.set('a', 1) // TypeError — key phải là object (hoặc symbol chưa đăng ký, từ ES2023)
wm.set({ id: 1 }, 3) // ok
wm.size // undefined — không có
[...wm] // TypeError — không duyệt đượcMap | WeakMap | |
|---|---|---|
| Key | bất kỳ kiểu nào | chỉ object / symbol |
| Duyệt được | có | không |
size | có | không |
| Giữ key sống | có | không (weak reference) |
Ý nghĩa của "weak": key bị mất mọi tham chiếu khác thì cả entry tự biến mất, không cần dọn tay.
javascript
let node = document.querySelector('#a')
const meta = new WeakMap()
meta.set(node, { clicks: 0 })
node.remove()
node = null // không còn ai giữ node → entry trong meta tự được thu hồiDùng Map khi cần đếm, duyệt, hoặc key không phải object. Dùng WeakMap khi gắn dữ liệu phụ vào một object mà không muốn giữ object đó sống: cache theo instance, dữ liệu riêng của class, metadata cho DOM node.
Lưu ý: WeakMap không duyệt được là cố ý, không phải thiếu sót — nếu duyệt được thì thời điểm GC chạy sẽ quan sát được từ code, phá tính tất định của ngôn ngữ.