در جاوا اسکریپت، هر دو کپی کم عمق (Shallow copy) و کپی عمیق (Deep copy) روش هایی برای کپی کردن اشیا (Objects) هستند، اما رفتارهای متفاوتی با توجه به اشیاء تو در تو (Nested objects) و مراجع آنها دارند.
یک کپی کم عمق (Shallow copy) یک شی جدید ایجاد می کند که تکراری از شی اصلی است، اما فقط ساختار سطح بالای شی را کپی می کند. اگر شی اصلی حاوی اشیاء تو در تو (Nested objects) باشد، کپی کم عمق به جای ایجاد تکراری از آنها، ارجاعات را به همان اشیاء تودرتو حفظ می کند. این به این معنی است که تغییرات ایجاد شده در اشیاء تودرتو در کپی کم عمق روی شی اصلی نیز تأثیر می گذارد و بالعکس.
می توانید با استفاده از روش هایی مانند ()Object.assign یا عملگر spread (...) یک کپی کم عمق در جاوا اسکریپت ایجاد کنید.
در تصویر بالا مشاهده میشود با اینکه از عملگر spread استفاده شده اما شی آدرس (address) همچنان بصورت ارجاعی (Reference) عمل کرده است و با تغییر ادرس شی کپی (shallowCopy) آدرس شی اصلی (originalObject) هم تغییر کرده است.
از سوی دیگر، یک کپی عمیق (Deep copy) ، یک کپی کاملا مستقل از شی اصلی، شامل تمام اشیاء تودرتو ایجاد می کند. ارجاعات به همان اشیاء تودرتو را حفظ نمی کند. در عوض، نمونه های تکراری از آنها ایجاد می کند. تغییرات ایجاد شده در کپی عمیق، شی اصلی را تحت تاثیر قرار نمی دهد و بالعکس.
ایجاد یک کپی عمیق در جاوا اسکریپت می تواند پیچیده تر باشد، به خصوص برای اشیاء عمیق تو در تو. می توانید از بازگشت برای ایجاد یک کپی عمیق استفاده کنید، یا می توانید از کتابخانه هایی مانند Lodash که یک تابع cloneDeep را برای این منظور ارائه می دهد استفاده کنید.
در تصویر بالا مشاهده میشود استفاده از عملگر spread و Object destructure باعث شده شی آدرس (address) بصورت ارجاعی (Reference) عمل نکند و با تغییر ادرس شی کپی (deepCopy) آدرس شی اصلی (originalObject) هم تغییر نکند!
تفاوت اصلی بین کپی کم عمق (Shallow copy) و کپی عمیق (Deep copy) در این است که کپی عمیق، کپی هایی از تمام اشیاء تودرتو (Nested objects) ایجاد می کند و اطمینان حاصل می کند که تغییرات در کپی بر شی اصلی تأثیر نمی گذارد. در مقابل، یک کپی کم عمق فقط ساختار سطح بالا را کپی می کند و ارجاعات را به همان اشیاء تودرتو حفظ می کند، بنابراین تغییرات می تواند بر روی شی اصلی و کپی تأثیر بگذارد.
ممنونم که تا انتهای مقاله همراهم بودید، امیدوارم براتون مفید باشه.