structuredClone للنسخ العميقة
انسخوا الكائنات المعقدة بأمان.
structuredClone للنسخ العميقة درس مجاني في JavaScript Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في JavaScript Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة JavaScript Academy 4 دروس في المجموع.
مشكلة النسخ العميق
ينشئ كلٌّ من Spread وObject.assign نسخًا سطحية؛ إذ تتم مشاركة الكائنات المتداخلة عبر المرجع. ولتكرار بنية متداخلة بالكامل، تحتاج إلى نسخة عميقة.
يمثل structuredClone الحل المدمج في اللغة.
لماذا لا يكفي Spread
تشترك النسخة المنشأة باستخدام Spread في الكائنات المتداخلة. لذلك يؤثر تعديل الجزء المتداخل من النسخة أيضًا في الكائن الأصلي.
const original = { user: { name: 'Ada' } };
const shallow = { ...original };
shallow.user.name = 'Grace';
console.log(original.user.name);structuredClone ينقذ الموقف
ينسخ structuredClone البنية بأكملها بشكل递归ي. ولا تصل التغييرات التي تُجرى على النسخة المستنسخة إلى الكائن الأصلي مطلقًا.
const original = { user: { name: 'Ada' } };
const deep = structuredClone(original);
deep.user.name = 'Grace';
console.log(original.user.name);
console.log(deep.user.name);كائنات متداخلة مستقلة
بعد الاستنساخ، يصبح كل كائن متداخل مرجعًا مميزًا، ولذلك تكون مقارنة الهوية خاطئة في كل مستوى.
const original = { a: { b: { c: 1 } } };
const clone = structuredClone(original);
console.log(original === clone);
console.log(original.a === clone.a);
console.log(original.a.b === clone.a.b);استنساخ المصفوفات
تُستنسخ المصفوفات، بما فيها المصفوفات المتداخلة، بعمق أيضًا. وإضافة عنصر إلى مصفوفة متداخلة في النسخة المستنسخة لا تغيّر المصدر.
const original = { tags: ['a', 'b'], meta: { nested: [1] } };
const clone = structuredClone(original);
clone.meta.nested.push(2);
console.log(original.meta.nested);
console.log(clone.meta.nested);التعامل مع Maps وSets
بخلاف JSON.parse(JSON.stringify(...))، يدعم structuredClone أنواعًا مدمجة كثيرة، منها Map وSet وDate.
const original = { items: new Set([1, 2, 3]), when: new Date(0) };
const clone = structuredClone(original);
clone.items.add(4);
console.log([...original.items]);
console.log([...clone.items]);
console.log(clone.when instanceof Date);التعامل مع المراجع الدائرية
يتسبب الكائن الذي يشير إلى نفسه في فشل حيلة JSON، لكن يمكن استنساخه بسهولة باستخدام structuredClone.
const node = { name: 'root' };
node.self = node;
const clone = structuredClone(node);
console.log(clone.name);
console.log(clone.self === clone);ما لا يمكن استنساخه
لا يستطيع structuredClone نسخ الدوال أو عقد DOM؛ إذ يُطلق خطأ DataCloneError. كما أنه يُسقط سلاسل النماذج الأولية، ويعيد كائنات عادية.
try {
structuredClone({ fn: () => 1 });
} catch (e) {
console.log(e.name);
}لا تُحفَظ النماذج الأولية
يصبح مثيل الفئة المستنسخ كائنًا عاديًا: تُنسخ البيانات، لكن الدوال والنموذج الأولي يُفقدان.
class Point {
constructor(x) { this.x = x; }
show() { return this.x; }
}
const p = new Point(5);
const clone = structuredClone(p);
console.log(clone.x);
console.log(clone instanceof Point);structuredClone مقارنةً بحيلة JSON
تفقد الطريقة القديمة JSON.parse(JSON.stringify(x)) القيمة undefined، وتتحول التواريخ فيها إلى سلاسل نصية، كما تفشل عند وجود دورات. يتجنب structuredClone هذه المشكلات مع البيانات القابلة للتسلسل.
const data = { when: new Date(0), missing: undefined, n: 5 };
const viaJson = JSON.parse(JSON.stringify(data));
const viaClone = structuredClone(data);
console.log(typeof viaJson.when);
console.log(viaClone.when instanceof Date);لماذا يهم ذلك
يوفر structuredClone نسخة عميقة موثوقة ومدمجة للبيانات العادية، ويحل محل النسخ الهشة التي تُكتب يدويًا. استخدمه عندما تحتاج إلى نسخة مستقلة بالكامل من حالة متداخلة، وتذكّر أنه يزيل الدوال والنماذج الأولية.
const state = { list: [{ id: 1 }], settings: { theme: 'dark' } };
const snapshot = structuredClone(state);
snapshot.list[0].id = 99;
console.log(state.list[0].id);
console.log(snapshot.list[0].id);تحقق سريع
لماذا نستخدم structuredClone بدلًا من معامل Spread مع البيانات المتداخلة؟
مراجعة: structuredClone
لقد تعلمت كيفية إجراء نسخ عميق موثوق:
- النسخ باستخدام Spread سطحي، بينما ينسخ
structuredCloneبعمق. - يدعم
MapوSetوDateوالمراجع الدائرية. - لا يمكنه استنساخ الدوال أو عقد DOM، كما يُسقط النماذج الأولية.
- يمثل بديلًا أكثر أمانًا لحيلة
JSON.parse(JSON.stringify()).
الأسئلة الشائعة
هل درس «structuredClone للنسخ العميقة» مجاني؟
نعم — نص درس «structuredClone للنسخ العميقة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة JavaScript Academy، انتقل إلى CoddyKit PRO. تتضمن دورة JavaScript Academy 4 دروس في المجموع.
ماذا ستتعلم في «structuredClone للنسخ العميقة»؟
انسخوا الكائنات المعقدة بأمان. تتمرن على JavaScript Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ JavaScript Academy؟
لا تُشترط خبرة سابقة. JavaScript Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «structuredClone للنسخ العميقة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس JavaScript Academy هذا؟
نعم. كل درس في JavaScript Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- تجميد الكائنات وإغلاقها باستخدام Object.freeze وseal
- التجميد السطحي مقابل العميق
- أنماط التحديث غير القابل للتغيير
- structuredClone للنسخ العميقة