يعد نسخ البيانات مهمة شائعة في عالم البرمجة. ومع ذلك، لا يتم إنشاء كافة النسخ على قدم المساواة. المصطلحان اللذان يظهران غالبًا هما نسخة سطحية ونسخة عميقة. يعد فهم الفرق بينهما أمرًا بالغ الأهمية لتجنب الأخطاء التي قد يصعب اكتشافها.
نسخة سطحية تنسخ المستوى الأول فقط من الكائن، مع ترك إشارات إلى البيانات الأصلية في مستويات أعمق. هذا يعني أنه إذا كان الكائن الأصلي يحتوي على كائنات أخرى بداخله (متداخلة)، فإن النسخة السطحية ستنسخ فقط المراجع إلى تلك الكائنات، وليس الكائنات نفسها.
مثال في جافا سكريبتconst originalArray = [1, 2, [3, 4]]; const shallowCopy = originalArray.slice(); shallowCopy[2][0] = 99; console.log(originalArray); // [1, 2, [99, 4]] console.log(shallowCopy); // [1, 2, [99, 4]]مثال في بايثون
const originalArray = [1, 2, [3, 4]]; const shallowCopy = originalArray.slice(); shallowCopy[2][0] = 99; console.log(originalArray); // [1, 2, [99, 4]] console.log(shallowCopy); // [1, 2, [99, 4]]نصيحة:
ملحوظة:
ما هي النسخة العميقة؟
نسخة عميقة تنسخ جميع مستويات الكائن، مما يؤدي إلى تكرار الهياكل المتداخلة. وهذا يعني أن أي تغييرات يتم إجراؤها على النسخة لن تؤثر على الكائن الأصلي.
مثال في جافا سكريبتconst originalArray = [1, 2, [3, 4]]; const shallowCopy = originalArray.slice(); shallowCopy[2][0] = 99; console.log(originalArray); // [1, 2, [99, 4]] console.log(shallowCopy); // [1, 2, [99, 4]]مثال في بايثون
const originalArray = [1, 2, [3, 4]]; const shallowCopy = originalArray.slice(); shallowCopy[2][0] = 99; console.log(originalArray); // [1, 2, [99, 4]] console.log(shallowCopy); // [1, 2, [99, 4]]نصيحة:
ملحوظة:
المقارنة المباشرة: النسخة الضحلة مقابل النسخة العميقة
نسخة سطحية | نسخة عميقة | |
---|---|---|
نعم | لا | |
لا | نعم | |
نعم | لا | |
قليل | عالي |
حالات الاستخدام الشائعة
المشاكل الشائعة وكيفية تجنبها
مثال:
const originalArray = [1, 2, [3, 4]]; const shallowCopy = originalArray.slice(); shallowCopy[2][0] = 99; console.log(originalArray); // [1, 2, [99, 4]] console.log(shallowCopy); // [1, 2, [99, 4]]نصيحة:
أدوات ووظائف لعمل نسخ في جافا سكريبت
const originalArray = [1, 2, [3, 4]]; const shallowCopy = originalArray.slice(); shallowCopy[2][0] = 99; console.log(originalArray); // [1, 2, [99, 4]] console.log(shallowCopy); // [1, 2, [99, 4]]باستخدام ... انتشار للنسخ الضحلة
const originalArray = [1, 2, [3, 4]]; const shallowCopy = originalArray.slice(); shallowCopy[2][0] = 99; console.log(originalArray); // [1, 2, [99, 4]] console.log(shallowCopy); // [1, 2, [99, 4]]استخدام StructuredClone() للنسخ العميق
const originalArray = [1, 2, [3, 4]]; const shallowCopy = originalArray.slice(); shallowCopy[2][0] = 99; console.log(originalArray); // [1, 2, [99, 4]] console.log(shallowCopy); // [1, 2, [99, 4]]نصيحة:
استخدام مكتبات مثل Lodash للنسخ العميق
const originalArray = [1, 2, [3, 4]]; const shallowCopy = originalArray.slice(); shallowCopy[2][0] = 99; console.log(originalArray); // [1, 2, [99, 4]] console.log(shallowCopy); // [1, 2, [99, 4]]الأدوات والوظائف لعمل نسخ في بايثون
const originalArray = [1, 2, [3, 4]]; const shallowCopy = originalArray.slice(); shallowCopy[2][0] = 99; console.log(originalArray); // [1, 2, [99, 4]] console.log(shallowCopy); // [1, 2, [99, 4]]الاختلافات بين Copy.copy() وcopy.deepcopy()
ملخص واستنتاج
الأسئلة الشائعة
2. هل يمكنك عمل نسخة عميقة بدون مكتبات خارجية في JavaScript؟
3. ماذا يحدث إذا حاولت تعديل كائن متداخل في نسخة سطحية؟
4. هل من الأفضل دائمًا استخدام النسخة العميقة لتجنب المشاكل؟
5. ما هي المزايا التي يتمتع بها StructuredClone() مقارنة بطرق النسخ العميق الأخرى في JavaScript؟
أخبرني في التعليقات، هل كنت تعرف بالفعل عن النسخ العميقة والسطحية وهل واجهتك مشكلة بسببها من قبل؟
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3