Set là tập hợp giá trị không trùng lặp; WeakSet là bản chỉ chứa object và giữ tham chiếu yếu.
javascript
const s = new Set([1, 2, 2, 3])
s.size // 3 — trùng bị loại
s.has(2) // true — O(1), nhanh hơn arr.includes()
s.add(4)
s.delete(1)
[...s] // [2, 3, 4] — duyệt được
// khử trùng lặp mảng — cách ngắn nhất
const unique = [...new Set(arr)]So sánh trong Set dùng SameValueZero, nên hành vi với NaN khác ===:
javascript
new Set([NaN, NaN]).size // 1 — NaN được coi là bằng chính nó ở đây
new Set([0, -0]).size // 1
new Set([{}, {}]).size // 2 — hai object khác nhauWeakSet chỉ có add/has/delete, không size, không duyệt:
javascript
const visited = new WeakSet()
function walk(node) {
if (visited.has(node)) return // tránh lặp vô hạn khi đồ thị có chu trình
visited.add(node)
node.children.forEach(walk)
}
// node bị xoá khỏi cây → tự rời WeakSet, không rò bộ nhớChọn thế nào: cần đếm, duyệt, hoặc chứa giá trị nguyên thuỷ → Set. Chỉ cần đánh dấu "object này đã xử lý" mà không muốn giữ nó sống → WeakSet.
Ghi chú: từ 2024 có thêm phép toán tập hợp sẵn — union, intersection, difference (Chrome 122+, Safari 17+), thay cho việc tự viết bằng filter.