Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

النسخ السطحي والعميق

جزء من قسم Logic & Flow في رحلة JavaScript على Coddy — الدرس 25 من 65.

عند نسخ الكائنات، لدينا نوعان من النسخ:

  1. النسخ السطحي (Shallow Copy) - ينسخ المستوى الأول فقط
  2. النسخ العميق (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 (مستقل تماماً)
challenge icon

التحدي

سهل

أنشئ دالة باسم processCart تأخذ سلسلة نصية (string) بتنسيق JSON تمثل عربة تسوق. تحتوي العربة على مصفوفة من المنتجات مع الأسماء والأسعار. مهمتك هي:

  1. تحليل سلسلة JSON النصية إلى كائن JavaScript
  2. إنشاء عربتين منفصلتين منها
  3. في العربة الثانية:
    1. إضافة خاصية discounted لكل عنصر وتعيينها إلى false
    2. تطبيق خصم بنسبة 10% على جميع العناصر التي يكون الـ price الخاص بها أكبر من 50
    3. تعيين 'discounted' إلى true للعناصر التي حصلت على الخصم
  4. إرجاع مصفوفة تحتوي على كلتا العربتين

ورقة مرجعية

عند نسخ الكائنات (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) {
    // اكتب الكود هنا
}
// لا تكتب أي شيء خارج الدالة
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Logic & Flow