برنامه نویسی

کارآمدترین راه برای شبیه سازی عمیق یک شی در جاوا اسکریپت چیست؟

کلون کردن یک شی در جاوا اسکریپت مستلزم ایجاد یک نسخه تکراری است که در آن تغییرات کلون بر روی نسخه اصلی تأثیر نمی گذارد. شبیه سازی عمیق شامل کپی کردن همه ویژگی ها، از جمله اشیاء تو در تو است. در زیر کارآمدترین روش ها برای دستیابی به شبیه سازی عمیق، با مزایا و معایب آن ها آورده شده است.


1. استفاده از JSON.parse() و JSON.stringify()

این روش یک شی را به یک رشته JSON تبدیل می کند و سپس آن را به یک شی جدید تجزیه می کند.

مثال:

const obj1 = { name: "John", age: 30, address: { city: "New York" } };
const obj2 = JSON.parse(JSON.stringify(obj1));

obj2.address.city = "Los Angeles";
console.log(obj1.address.city); // Output: "New York"
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مزایا:

  • ساده و مختصر.
  • برای اشیاء با مقادیر اولیه و تودرتو به خوبی کار می کند.

محدودیت ها:

  • پشتیبانی نمی کند:

    • توابع.
    • undefined ارزش ها
    • نمادها
    • مراجع دایره ای
  • اشیاء خاص را تبدیل می کند (مثلا Date، Set، Map) به اشیاء ساده.

2. استفاده از structuredClone()

این structuredClone() متد یک API بومی جاوا اسکریپت است که اشیاء را عمیقاً شبیه سازی می کند و از انواع داده های بیشتری پشتیبانی می کند JSON.parse() و JSON.stringify().

مثال:

const obj1 = { name: "Alice", age: 25, date: new Date() };
const obj2 = structuredClone(obj1);

obj2.date.setFullYear(2025);
console.log(obj1.date.getFullYear()); // Original date remains unchanged
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مزایا:

  • پشتیبانی از انواع پیچیده مانند Date، Set، Map، و TypedArray.
  • ارجاعات دایره ای را به خوبی مدیریت می کند.

محدودیت ها:

  • به یک مرورگر مدرن یا Node.js (v17+) نیاز دارد.
  • کارایی کمی کمتر از JSON.parse() برای اشیاء ساده

3. استفاده از Lodash's cloneDeep()

Lodash یک کتابخانه ابزار است که یک کتابخانه قابل اعتماد ارائه می دهد cloneDeep() عملکرد برای شبیه سازی عمیق

مثال:

const _ = require("lodash");

const obj1 = { name: "Mark", hobbies: ["reading", "traveling"] };
const obj2 = _.cloneDeep(obj1);

obj2.hobbies.push("coding");
console.log(obj1.hobbies); // Output: ["reading", "traveling"]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مزایا:

  • تمام انواع داده ها، از جمله مراجع دایره ای را مدیریت می کند.
  • قابل اعتماد برای کاربردهای درجه تولید.

محدودیت ها:

  • نیاز به نصب Lodash (npm install lodash).
  • یک وابستگی به پروژه شما اضافه می کند.

4. استفاده از توابع بازگشتی

برای موارد استفاده سفارشی و کوچک، می توانید عملکرد شبیه سازی عمیق خود را بنویسید.

مثال:

const deepClone = (obj) => {
  if (obj === null || typeof obj !== "object") return obj;

  if (Array.isArray(obj)) return obj.map(deepClone);

  const clonedObj = {};
  for (const key in obj) {
    clonedObj[key] = deepClone(obj[key]);
  }
  return clonedObj;
};

const obj1 = { name: "Emma", address: { city: "London", zip: 12345 } };
const obj2 = deepClone(obj1);

obj2.address.city = "Paris";
console.log(obj1.address.city); // Output: "London"
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مزایا:

  • کنترل کامل بر فرآیند شبیه سازی
  • بدون نیاز به کتابخانه خارجی

محدودیت ها:

  • پرمخاطب تر و مستعد خطا.
  • برای رسیدگی به اشیاء خاص مانند Date، Set، Map.

5. استفاده از Spread Syntax یا Object.assign() (کلونینگ کم عمق)

این روش ها یک کپی کم عمق ایجاد می کنند و فقط ویژگی های سطح بالا را کپی می کنند. برای شبیه سازی عمیق، این رویکرد کافی نیست.

مثال:

const obj1 = { name: "Liam", address: { city: "Berlin" } };
const obj2 = { ...obj1 };

obj2.address.city = "Munich";
console.log(obj1.address.city); // Output: "Munich" (Not a deep clone)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید


مقایسه روشها

روش از Refs دایره ای پشتیبانی می کند از انواع خاص پشتیبانی می کند عملکرد استفاده از مورد
JSON.parse/JSON.stringify خیر خیر بالا اشیاء ساده، ارجاعات غیر دایره ای.
structuredClone() بله بله متوسط اشیاء پیچیده، محیط های مدرن.
Lodash.cloneDeep() بله بله متوسط برنامه های کاربردی تولید
بازگشتی سفارشی اختیاری خیر متفاوت است راه حل های سبک وزن سفارشی
گسترش / Object.assign خیر خیر بالا فقط شبیه سازی کم عمق

نتیجه گیری

  • استفاده کنید structuredClone() اگر به یک راه حل داخلی برای محیط های مدرن نیاز دارید.
  • استفاده کنید JSON.parse() و JSON.stringify() برای سناریوهای ساده و حیاتی عملکرد.
  • از Lodash استفاده کنید cloneDeep() برای شبیه سازی عمیق قابل اعتماد و درجه تولید.
  • یک تابع سفارشی بنویسید برای موارد استفاده منحصر به فرد و سبک.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا