TaskCreate original = {date: new Date(0), nums: [1,2,3], set: new Set(['a','b'])}. structuredClone it. Mutate copy.nums.push(4) and copy.set.add('c'). Log original.nums.length (3), original.set.size (2), copy.nums.length (4), copy.set.size (3), and copy.date instanceof Date (true).
structuredClone — proper deep copy
100 XP7 min
Theory
The right way to deep-copy
JSON.parse(JSON.stringify(x)) is the classic deep-copy hack, but:
- Loses
Dateobjects (become strings). - Loses
MapandSet(become empty objects). - Loses
undefinedvalues (become missing keys). - Throws on cycles.
structuredClone is the standard answer since 2022:
const original = {
d: new Date(),
set: new Set([1, 2, 3]),
nested: { arr: [1, 2, 3] },
};
const copy = structuredClone(original);
copy.nested.arr.push(4);
original.nested.arr.length; // 3, untouchedWhat it handles
Dates, Maps, Sets, ArrayBuffers, typed arrays, Blobs, even circular references. Symbols and functions don't survive (they're not serializable — same as JSON.stringify).
When to reach for it
Anywhere you'd previously use the JSON.parse hack — Redux state, undo stacks, "snapshot then mutate" patterns. C9-09 uses it for an undo stack.
🔒
Sign up to start coding
Theory is open to everyone. The interactive editor, live preview, and check are unlocked with a 7-day free trial — card required, cancel anytime.
Sign up — free trial →First 10 lessons in each track are free. No card needed for those.