Deep Clone คือการสร้างสำเนาของออบเจกต์ทั้งหมด รวมถึงออบเจกต์ย่อย (Nested Objects) ทั้งหมด ทำให้สำเนาและต้นฉบับแยกจากกันสมบูรณ์ ไม่มีการ Shared Reference
ตัวอย่างโค้ด (JSON Method)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Deep Clone</title>
<style>
body { font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; }
.result { font-size: 18px; font-weight: 500; color: rebeccapurple; }
</style>
</head>
<body>
<h1>Deep Cloning ออบเจกต์ใน JavaScript</h1>
<div class="result"></div>
<button class="Btn">คลิกที่นี่</button>
<h3>คลิกปุ่มด้านบนเพื่อ Deep Clone obj object</h3>
<script>
const BtnEle = document.querySelector(".Btn");
const resEle = document.querySelector(".result");
const obj = {
firstName: "Rohan",
lastName: "Sharma",
age: 22,
rollNo: "A12"
};
// Deep Clone ด้วย JSON
const obj1 = JSON.parse(JSON.stringify(obj));
BtnEle.addEventListener("click", () => {
obj.firstName = "Mohit"; // เปลี่ยนค่าต้นฉบับ
resEle.innerHTML = `obj.firstName = ${obj.firstName}<br>`;
resEle.innerHTML += `obj1.firstName = ${obj1.firstName}<br><br>`;
});
</script>
</body>
</html>
วิธี Deep Clone ต่างๆ
| วิธี | รองรับ | ข้อจำกัด |
|---|---|---|
JSON.parse(JSON.stringify(obj)) | Plain Objects, Arrays, Primitives | ❌ Functions, Date, RegExp, Map, Set, undefined, Circular Ref |
structuredClone(obj) (Modern) | เกือบทุกอย่าง รวม Date, RegExp, Map, Set, Blob, Circular Ref | ❌ Functions, DOM Nodes, WeakMap/WeakSet |
Lodash _.cloneDeep() | ทุกอย่าง รวม Functions (copy reference) | ต้องติดตั้ง Library |
| Custom Recursive Function | ควบคุมได้เอง | เขียนเองยุ่งยาก |
Shallow vs Deep Clone
const original = { a: 1, nested: { b: 2 } };
// Shallow - nested ยัง share reference
const shallow = { ...original };
shallow.nested.b = 99;
console.log(original.nested.b); // 99 😱 เปลี่ยนไปด้วย!
// Deep - แยกสมบูรณ์
const deep = JSON.parse(JSON.stringify(original));
deep.nested.b = 99;
console.log(original.nested.b); // 2 ✅ ไม่เปลี่ยน
ผลลัพธ์
obj.firstName = Mohit (เปลี่ยนแล้ว), obj1.firstName = Rohan (ไม่เปลี่ยน - Deep Clone สำเร็จ)