Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> JavaScript

Deep Cloning ออบเจกต์ใน JavaScript

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 สำเร็จ)