DEV Community

Shanthi's Dev Diary
Shanthi's Dev Diary

Posted on

structuredClone() — The Deep Copy Hero JavaScript Deserved 🦸‍♀️

Let’s be honest.

Every JavaScript developer has broken production at least once because of copying objects the wrong way.

You thought you cloned it.

JavaScript smiled.

Then changed the original too.

Enter structuredClone() — the native deep-cloning superhero that finally says:

“Relax. I got this.”


The Problem: “Why did my original object change?! 😭”

Classic situation:

const user = {
  name: "Shanthi",
  skills: ["JavaScript", "React"]
};

const copy = user;
copy.skills.push("TypeScript");

console.log(user.skills);
// ["JavaScript", "React", "TypeScript"] 😱
Enter fullscreen mode Exit fullscreen mode

You didn’t mean to update the original…

JavaScript just assumed you were feeling adventurous.


The Old (Painful) Way 😬

We all tried this at some point:

JSON.parse(JSON.stringify(obj))
Enter fullscreen mode Exit fullscreen mode

It looks clever.

It feels clever.

But it betrays you silently.


What it breaks:

  • Date becomes a string
  • Map, Set vanish into thin air
  • undefined, NaN, Infinity disappear
  • ❌ Circular references? App crash 💥

Basically, it copies your data and forgets its personality.


Meet structuredClone() 🧠✨

JavaScript finally said:

“Okay fine, here’s a proper deep clone.”

const cloned = structuredClone(original);
Enter fullscreen mode Exit fullscreen mode

That’s it.

No imports.

No libraries.

No emotional damage.


What Makes structuredClone So Cool?

✅ It actually understands JavaScript data.

It supports:

  • Objects & Arrays
  • Date
  • Map, Set
  • RegExp
  • BigInt
  • TypedArrays
  • Circular references (YES 🔥)

Basically, real-world data. Not just JSON-shaped dreams.


Example: Deep Clone That Actually Works

const user = {
  name: "Shanthi",
  meta: {
    joined: new Date(),
  },
};

const clone = structuredClone(user);

clone.meta.joined.setFullYear(2030);

console.log(user.meta.joined.getFullYear());
// Still 2024 😌
Enter fullscreen mode Exit fullscreen mode

No side effects.

No surprises.

No apology messages to your team.


Circular References? Bring It On 💪

const obj = {};
obj.self = obj;

const cloned = structuredClone(obj);

console.log(cloned.self === cloned); // true
Enter fullscreen mode Exit fullscreen mode

Old methods would:

  • ❌ Cry
  • ❌ Throw errors
  • ❌ Give up on life

structuredClone just nods politely and continues.


Map & Set — Finally Respected 🫶

const data = {
  map: new Map([["a", 1]]),
  set: new Set([1, 2, 3]),
};

const clone = structuredClone(data);

clone.map.set("b", 2);

console.log(data.map.has("b")); // false 🎉
Enter fullscreen mode Exit fullscreen mode

Your original data remains unbothered.


What It Won’t Clone (And That’s Fair)

Some things simply refuse to be cloned:

  • ❌ Functions (they have commitment issues)
  • ❌ DOM nodes (use cloneNode)
  • ❌ Symbols
  • WeakMap, WeakSet

Try cloning these and JavaScript will politely throw a DataCloneError instead of silently ruining your data.

Honestly? We appreciate the honesty.


structuredClone vs Spread Operator 🥊

const original = { a: { b: 1 } };

const shallow = { ...original };
const deep = structuredClone(original);

shallow.a.b = 2;

console.log(original.a.b); // 2 ❌
deep.a.b = 3;
console.log(original.a.b); // still 2 ✅
Enter fullscreen mode Exit fullscreen mode

Spread operator:

“I’ll copy the top layer and hope for the best.”

structuredClone:

“I’ll copy everything. Thoroughly.”


Performance: Should I Worry?

  • Faster than JSON.parse(JSON.stringify())
  • Optimized by modern JS engines
  • Safe for state cloning and message passing

⚠️ Just don’t clone massive objects in tight loops unless you enjoy performance reviews.


Where You’ll Actually Use This

  • React state updates (immutability without headaches)
  • Redux / Zustand / any state manager
  • Web Workers
  • Undo / redo features
  • Caching snapshots
  • “Why did this mutate?” bug prevention

Browser & Runtime Support 🌍

Good news:

  • Modern browsers ✅
  • Node.js 17+ ✅
  • Deno, Bun ✅

No polyfills. No drama.


Final Thoughts 💭

structuredClone() is:

  • ✅ Native
  • ✅ Safe
  • ✅ Deep
  • ✅ Honest about errors

If you’re still using JSON.parse(JSON.stringify()), it’s okay.

We all grow. 😄

Modern JavaScript has given us a proper deep clone.

Let’s actually use it.


💬 Have you been betrayed by shallow copies before?

Share your cloning horror stories in the comments!

Top comments (0)