النسخ السطحي والعميق
جزء من قسم Logic & Flow في رحلة JavaScript على Coddy — الدرس 25 من 65.
عند نسخ الكائنات، لدينا نوعان من النسخ:
- النسخ السطحي (Shallow Copy) - ينسخ المستوى الأول فقط
- النسخ العميق (Deep Copy) - ينسخ جميع المستويات المتداخلة
طرق النسخ السطحي:
باستخدام معامل النشر (spread operator):
const original = { a: 1, b: { x: 2 } };
const spreadCopy = { ...original };باستخدام Object.assign() الذي ينشئ كائناً جديداً عن طريق نسخ الخصائص من الكائن المصدر إلى الكائن الهدف:
const assignCopy = Object.assign({}, original);مشكلة في النسخ السطحي (Shallow Copy):
original.b.x = 3;
console.log(spreadCopy.b.x); // 3
// (تشترك الكائنات المتداخلة في المرجع)
console.log(assignCopy.b.x); // 3فهم طرق JSON والنسخ العميق (Deep Copy)
JSON.stringify() يحول كائن JavaScript إلى سلسلة JSON نصية:
const obj = { name: "John", age: 30 };
const jsonString = JSON.stringify(obj);
console.log(jsonString); // "{"name":"John","age":30}"JSON.parse() يحول سلسلة JSON النصية مرة أخرى إلى كائن JavaScript:
const backToObject = JSON.parse(jsonString);
console.log(backToObject); // { name: "John", age: 30 }نسخة عميقة باستخدام JSON:
const original = { a: 1, b: { x: 2 } };
const deepCopy = JSON.parse(JSON.stringify(original));
original.b.x = 3;
console.log(deepCopy.b.x); // 2 (مستقل تماماً)التحدي
سهلأنشئ دالة باسم processCart تأخذ سلسلة نصية (string) بتنسيق JSON تمثل عربة تسوق. تحتوي العربة على مصفوفة من المنتجات مع الأسماء والأسعار. مهمتك هي:
- تحليل سلسلة JSON النصية إلى كائن JavaScript
- إنشاء عربتين منفصلتين منها
- في العربة الثانية:
- إضافة خاصية
discountedلكل عنصر وتعيينها إلى false - تطبيق خصم بنسبة 10% على جميع العناصر التي يكون الـ
priceالخاص بها أكبر من 50 - تعيين 'discounted' إلى true للعناصر التي حصلت على الخصم
- إضافة خاصية
- إرجاع مصفوفة تحتوي على كلتا العربتين
ورقة مرجعية
عند نسخ الكائنات (objects)، لدينا نوعان من النسخ:
- النسخ السطحي (Shallow Copy) - ينسخ المستوى الأول فقط
- النسخ العميق (Deep Copy) - ينسخ جميع المستويات المتداخلة
طرق النسخ السطحي:
باستخدام عامل الانتشار (spread operator):
const original = { a: 1, b: { x: 2 } };
const spreadCopy = { ...original };باستخدام Object.assign():
const assignCopy = Object.assign({}, original);المشكلة في النسخ السطحي:
original.b.x = 3;
console.log(spreadCopy.b.x); // 3 (nested objects share reference)طرق JSON:
تقوم JSON.stringify() بتحويل كائن JavaScript إلى سلسلة نصية بتنسيق JSON:
const obj = { name: "John", age: 30 };
const jsonString = JSON.stringify(obj);
console.log(jsonString); // "{"name":"John","age":30}"تقوم JSON.parse() بتحويل سلسلة JSON النصية مرة أخرى إلى كائن JavaScript:
const backToObject = JSON.parse(jsonString);
console.log(backToObject); // { name: "John", age: 30 }النسخ العميق باستخدام JSON:
const original = { a: 1, b: { x: 2 } };
const deepCopy = JSON.parse(JSON.stringify(original));
original.b.x = 3;
console.log(deepCopy.b.x); // 2 (completely independent)جرّب بنفسك
function processCart(jsonString) {
// اكتب الكود هنا
}
// لا تكتب أي شيء خارج الدالةيتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1السلاسل النصية بعمق
أساسيات السلاسل النصيةالتكرار عبر السلاسل النصيةTemplate Literalsدوال السلاسل النصيةمراجعة - String Weaver4JSON الجزء الثاني
التكرار عبر JSONJSON المتداخلالتسلسل الاختياري في JSONالنسخ السطحي والعميقمراجعة - متجر الدراجاتمراجعة - النظام الشمسي2المصفوفات متعددة الأبعاد
أساسيات المصفوفات ثنائية الأبعادالوصول إلى عناصر المصفوفات ثنائية الأبعادالحلقات المتداخلة مع المصفوفات ثنائية الأبعادمراجعة - المصفوفات ثنائية الأبعادجمع وطرح المصفوفاتالمصفوفات المتعرجة (Jagged Arrays)المصفوفات ثلاثية الأبعاد وما بعدهاأنماط المصفوفات ثنائية الأبعاد الشائعةمراجعة - كل شيء عن المصفوفات5المجموعات - الجزء الأول
ما هي المجموعة؟التكرار عبر المجموعاتإضافة عنصرإزالة عنصرالتحقق من وجود عنصرالحجم وهل هي فارغةالنسخ والمسحملخص - أساسيات المجموعات8مواضيع شيقة حول الـ Arrays
تفكيك الـ Arrayاستخدام الـ Spread Syntax في الـ Arraysالـ Sparse Arraysمراجعة - ورشة عمل الـ Arrays3JSON الجزء الأول
ما هو JSON؟التحقق من وجود المفتاحObject MethodsSpread Operator الجزء الأولSpread Operator الجزء الثانيحذف المفاتيحمراجعة - معالجة مفاتيح JSON