محمدحسین فکوری
محمدحسین فکوری
خواندن ۲ دقیقه·۱ سال پیش

تفاوت Shallow Copy و Deep Copy در جاوااسکریپت :

در جاوا اسکریپت، هر دو کپی کم عمق (Shallow copy) و کپی عمیق (Deep copy) روش هایی برای کپی کردن اشیا (Objects) هستند، اما رفتارهای متفاوتی با توجه به اشیاء تو در تو (Nested objects) و مراجع آنها دارند.

Shallow Copy و Deep Copy در جاوااسکریپت
Shallow Copy و Deep Copy در جاوااسکریپت


کپی کم عمق (Shallow copy) :

یک کپی کم عمق (Shallow copy) یک شی جدید ایجاد می کند که تکراری از شی اصلی است، اما فقط ساختار سطح بالای شی را کپی می کند. اگر شی اصلی حاوی اشیاء تو در تو (Nested objects) باشد، کپی کم عمق به جای ایجاد تکراری از آنها، ارجاعات را به همان اشیاء تودرتو حفظ می کند. این به این معنی است که تغییرات ایجاد شده در اشیاء تودرتو در کپی کم عمق روی شی اصلی نیز تأثیر می گذارد و بالعکس.

می توانید با استفاده از روش هایی مانند ()Object.assign یا عملگر spread (...) یک کپی کم عمق در جاوا اسکریپت ایجاد کنید.

نمونه ای از یک کپی کم عمق (Shallow copy) با عملگر spread:

مثال Shallow copy با عملگر spread
مثال Shallow copy با عملگر spread

در تصویر بالا مشاهده میشود با اینکه از عملگر spread استفاده شده اما شی آدرس (address) همچنان بصورت ارجاعی (Reference) عمل کرده است و با تغییر ادرس شی کپی (shallowCopy) آدرس شی اصلی (originalObject) هم تغییر کرده است.


کپی عمیق (Deep copy):

از سوی دیگر، یک کپی عمیق (Deep copy) ، یک کپی کاملا مستقل از شی اصلی، شامل تمام اشیاء تودرتو ایجاد می کند. ارجاعات به همان اشیاء تودرتو را حفظ نمی کند. در عوض، نمونه های تکراری از آنها ایجاد می کند. تغییرات ایجاد شده در کپی عمیق، شی اصلی را تحت تاثیر قرار نمی دهد و بالعکس.

ایجاد یک کپی عمیق در جاوا اسکریپت می تواند پیچیده تر باشد، به خصوص برای اشیاء عمیق تو در تو. می توانید از بازگشت برای ایجاد یک کپی عمیق استفاده کنید، یا می توانید از کتابخانه هایی مانند Lodash که یک تابع cloneDeep را برای این منظور ارائه می دهد استفاده کنید.

نمونه ای از یک کپی عمیق (Deep copy) با عملگر spread:

مثال Deep copy با عملگر spread
مثال Deep copy با عملگر spread

در تصویر بالا مشاهده میشود استفاده از عملگر spread و Object destructure باعث شده شی آدرس (address) بصورت ارجاعی (Reference) عمل نکند و با تغییر ادرس شی کپی (deepCopy) آدرس شی اصلی (originalObject) هم تغییر نکند!


تفاوت اصلی بین کپی کم عمق (Shallow copy) و کپی عمیق (Deep copy) در این است که کپی عمیق، کپی هایی از تمام اشیاء تودرتو (Nested objects) ایجاد می کند و اطمینان حاصل می کند که تغییرات در کپی بر شی اصلی تأثیر نمی گذارد. در مقابل، یک کپی کم عمق فقط ساختار سطح بالا را کپی می کند و ارجاعات را به همان اشیاء تودرتو حفظ می کند، بنابراین تغییرات می تواند بر روی شی اصلی و کپی تأثیر بگذارد.


ممنونم که تا انتهای مقاله همراهم بودید، امیدوارم براتون مفید باشه.

deep copyshallow copyجاوا اسکریپت
عاشق برنامه نویسی فرانت اند و هوش مصنوعی
شاید از این پست‌ها خوشتان بیاید