لا تحتاج لغة JavaScript إلى مقدمة، فهي لغة قوية ومتعددة الاستخدامات، ولكن إذا كنت قد عملت معها، فمن المحتمل أنك لاحظت بعض السلوكيات غير العادية. أحدها هو كيفية تعامل جافا سكريبت مع النسخ المتغيرة، خاصة عند العمل مع الكائنات. في هذه المقالة، سوف نستكشف مفهوم النسخ العميق وكيف يساعدنا على تجنب المشاكل غير المتوقعة عند تكرار البيانات في برامجنا.
عندما نقوم بعمل نسخة من متغير، تقوم JavaScript بإنشاء مساحة ذاكرة جديدة وتخزين القيمة المنسوخة هناك؛ ثم يشير المتغير الجديد إلى مساحة الذاكرة الجديدة هذه. على سبيل المثال:
x = 5; y = x;يشير
y إلى مساحة ذاكرة جديدة، والتي لها نفس قيمة x ، أي 5 سيكون شيئًا مثل هذا:
ينطبق المفهوم أعلاه فقط على القيم البدائية، أما بالنسبة للكائنات فهو مختلف. تخيل أن لدينا الكائنين التاليين:
let a = { name: 'Rick', lastName: 'Sanchez', }; let b = a;
في المثال أعلاه، b ليس لديه مساحة ذاكرة خاصة به كما قد نتوقع؛ بدلاً من ذلك، يشير a إلى مساحة الذاكرة حيث يتم تخزين a .
ما هي المشاكل التي يمكن أن يسببها هذا السلوك؟ بشكل أساسي، إذا قمت بتغيير أي حقل من a أو b ، فسوف يتغير كلا المتغيرين. قم بتشغيل الكود التالي وتحقق منه بنفسك.
let a = { name: 'Rick', lastName: 'Sanchez', }; let b = a; b.name = 'Morty'; console.log('a: ', a); // a: { name: 'Morty', lastName: 'Sanchez' } console.log('b: ', b); // b: { name: 'Morty', lastName: 'Sanchez' }
الحل لذلك؟ نحتاج إلى عمل نسخة عميقة لحفظ قيمة a في مساحة ذاكرة مستقلة جديدة يشير إليها b.
const b = JSON.parse(JSON.stringify(a));
بهذه الطريقة، نجبر JavaScript على إنشاء مساحة ذاكرة جديدة عن طريق تغيير التنسيق من Object إلى JSON. يتم ذلك باستخدام طريقة stringify، ثم يتم تحويل JSON بمساحة الذاكرة الخاصة به مرة أخرى إلى كائن باستخدام طريقة parse، بحيث يظل كلا المتغيرين مستقلين تمامًا.
هل حدث لك هذا التصرف الغريب من قبل؟ اسمحوا لي أن أعرف في التعليقات، سأكون سعيدًا بقراءتك!
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3