کپی کم عمق و کپی عمیق در جاوا اسکریپت

در جاوا اسکریپت، زمانی که با اشیاء و آرایه ها کار می کنید، ممکن است با مفاهیم کپی عمیق و کپی کم عمق مواجه شوید. این مفاهیم به روش های مختلف کپی کردن یک شی یا یک آرایه اشاره دارد و نحوه ذخیره و ارجاع داده های کپی شده را تعیین می کند. بیایید هر مفهوم را با جزئیات بررسی کنیم:
کپی کم عمق:
یک کپی کم عمق یک شی یا آرایه جدید ایجاد می کند، اما مقادیر درونی شیء کپی شده همچنان ارجاع به مقادیر شی اصلی هستند. به عبارت دیگر، کپی جدید حاوی ارجاعاتی به همان اشیاء یا آرایه های اصلی است. هر تغییری که در ویژگی های شی اصلی یا اشیاء تودرتو ایجاد شود در شیء کپی شده منعکس می شود و بالعکس. کپی کم عمق رفتار پیش فرض اکثر عملیات جاوا اسکریپت است.
در اینجا یک مثال برای نشان دادن کپی کردن سطحی یک شی آورده شده است:
const original = {
name: 'John',
age: 30,
hobbies: ['reading', 'swimming']
};
const shallowCopy = Object.assign({}, original);
shallowCopy.name = 'Jane';
shallowCopy.hobbies.push('running');
console.log(original); // { name: 'John', age: 30, hobbies: ['reading', 'swimming', 'running'] }
console.log(shallowCopy); // { name: 'Jane', age: 30, hobbies: ['reading', 'swimming', 'running'] }
در این مثال، Object.assign()
برای ایجاد یک کپی کم عمق از original
هدف – شی. اصلاح name
ملک در shallowCopy
را تحت تاثیر قرار نمی دهد original
هدف – شی. با این حال، هنگامی که ما یک سرگرمی جدید را وارد آن می کنیم hobbies
آرایه در shallowCopy
، همان تغییر در original
شی چون هر دو شیء ارجاع یکسانی به آن دارند hobbies
آرایه.
کپی عمیق:
یک کپی عمیق یک کپی کاملا مستقل از یک شی یا آرایه، شامل تمام اشیاء و آرایه های تودرتو ایجاد می کند. این تضمین می کند که هر تغییری که در شی اصلی ایجاد می شود، شیء کپی شده را تحت تأثیر قرار نمی دهد و بالعکس. کپی عمیق زمانی می تواند مفید باشد که می خواهید با یک نمونه جداگانه از یک شی کار کنید و آن را به طور مستقل تغییر دهید.
راه های متعددی برای دستیابی به یک کپی عمیق در جاوا اسکریپت وجود دارد و روش مناسب به پیچیدگی شی ای که کپی می کنید بستگی دارد. در اینجا یک مثال با استفاده از JSON.parse()
و JSON.stringify()
مواد و روش ها:
const original = {
name: 'John',
age: 30,
hobbies: ['reading', 'swimming']
};
const deepCopy = JSON.parse(JSON.stringify(original));
deepCopy.name = 'Jane';
deepCopy.hobbies.push('running');
console.log(original); // { name: 'John', age: 30, hobbies: ['reading', 'swimming'] }
console.log(deepCopy); // { name: 'Jane', age: 30, hobbies: ['reading', 'swimming', 'running'] }
در این مثال، JSON.stringify()
روش تبدیل می کند original
به یک رشته JSON و سپس JSON.parse()
رشته JSON را برای ایجاد یک شی جدید تجزیه می کند (deepCopy
). این روش به طور موثر یک کپی عمیق ایجاد می کند زیرا یک شی جدید با تمام مقادیر و اشیا یا آرایه های تودرتو ایجاد می کند.
شایان ذکر است که این روش دارای محدودیت هایی است. اگر شیء دارای توابع، نمادها یا ارجاعات چرخه ای باشد (اشاره به خودش یا اشیاء دیگری که یک حلقه را تشکیل می دهند) کار نخواهد کرد. در چنین مواردی، ممکن است لازم باشد از الگوریتمهای کپی عمیق سفارشی یا کتابخانههایی مانند Lodash استفاده کنید cloneDeep()
.
به طور خلاصه، کپی کم عمق و کپی عمیق در جاوا اسکریپت به روش های مختلف کپی کردن اشیا یا آرایه ها اشاره دارد. کپی کم عمق یک شی جدید ایجاد می کند که همان مقادیر اصلی را ارجاع می دهد، در حالی که کپی عمیق یک کپی کاملا مستقل ایجاد می کند، شامل تمام اشیاء تو در تو یا
آرایه ها