کپی اشیاء در جاوا اسکریپت – انجمن DEV

مقاله ای در مورد نحوه کپی کردن اشیا در جاوا اسکریپت و تلاش نکردن. این یک موضوع نسبتاً پیچیده است زیرا باید نحوه عملکرد جاوا اسکریپت و نحوه مدیریت منابع حافظه را در نظر بگیرید، اما وقتی آن را فهمیدید، هیچ مشکلی نخواهید داشت.
فرض کنید مجموعه ای از محصولات داریم و باید یک ویژگی جدید با مالیات های مربوط به هر محصول اضافه کنیم. اولین کار این است که از طریق آرایه با نقشه عبور کنیم زیرا آنچه می دانیم تغییرناپذیر است، این بدان معنی است که آرایه اصلی را تحت تأثیر قرار نمی دهد.
خوب ببینیم چه اتفاقی می افتد، اگر کد زیر را اجرا کنیم، چه اتفاقی می افتد این است که نقشه داریم، یک آرایه جدید تولید می کند و مالیات ها را به محصول اضافه می کنیم و شی را برمی گردانیم.
اما وقتی بررسی میکنیم میبینیم که هم اصلاح اصلی و هم اصلاح با محصولات جدید تحت تأثیر قرار گرفته است، اما چرا این اتفاق میافتد؟، ساده است زیرا JS چگونه مراجع حافظه را برای حل این مشکل مدیریت میکند، باید یک کپی از آن ایجاد کنیم. هدف – شی.
برای این کار از ساختارشکنی استفاده می کنیم و ببینیم چه نتایجی به دست می آوریم. با deconstructor یک کپی از شی تولید می کنیم و ویژگی مالیاتی جدید را اضافه می کنیم و آن را در یک ثابت ذخیره می کنیم تا بعداً آن را به عنوان نتیجه تابع برگردانیم.
حالا ما نتیجه مورد نیاز خود را داریم و خوب است، اما اکنون مشکلی را خواهیم دید که رایج است و آن کپی عمیق از اشیا است. ساختارشکنی فقط در یک سطح کار می کند، در این مورد در سطح اول، اما اگر آرایه فروشگاه ها را در نسخه اصلاح کنیم چه اتفاقی می افتد.
خوب اگر کپی ایجاد شده از طریق deconstruction را با شی جدید اصلاح کنیم و بخواهیم آخرین ذخیره موجود در آرایه را حذف کنیم، خواهیم دید که چه اتفاقی می افتد.
این همچنین روی چیدمان شی اصلی تأثیر گذاشت، اما چه لعنتی! این خطایی است که میتوانیم مرتکب شویم، میخواهیم ببینیم چگونه آن را حل کنیم تا بتوانیم کپی عمیقی از اشیا ایجاد کنیم.
ساده ترین راه برای انجام این کار این است که شی را به json از نوع رشته تبدیل کنید و سپس آن را دوباره به یک شی تبدیل کنید با این کار مطمئن می شویم که JS یک بخش حافظه مستقل جدید ایجاد می کند و اکنون می توانیم شی جدید را بدون ترس از تأثیرگذاری تغییر دهیم. اصلی
این تنها یک راه برای ایجاد کپی عمیق است، اما می توان آن را به روش های مختلف انجام داد.
اگر این مقاله را دوست داشتید یا چیز جدیدی یاد گرفتید، ممنون می شوم اگر من را دنبال کنید و به اشتراک بگذارید تا افراد بیشتری در مورد این موضوع بدانند.