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

کلون کردن یک شی در جاوا اسکریپت مستلزم ایجاد یک نسخه تکراری است که در آن تغییرات کلون بر روی نسخه اصلی تأثیر نمی گذارد. شبیه سازی عمیق شامل کپی کردن همه ویژگی ها، از جمله اشیاء تو در تو است. در زیر کارآمدترین روش ها برای دستیابی به شبیه سازی عمیق، با مزایا و معایب آن ها آورده شده است.
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()
برای شبیه سازی عمیق قابل اعتماد و درجه تولید. - یک تابع سفارشی بنویسید برای موارد استفاده منحصر به فرد و سبک.