أنماط التحديث غير القابل للتغيير
حدّثوا البيانات بإنشاء نسخ جديدة.
أنماط التحديث غير القابل للتغيير درس مجاني في JavaScript Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في JavaScript Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة JavaScript Academy 4 دروس في المجموع.
التحديث دون تغيير
تنشئ التحديثات دون تغيير نسخة جديدة مع تطبيق التغيير عليها، مع إبقاء النسخة الأصلية دون تغيير. وهذا هو جوهر إدارة الحالة القابلة للتنبؤ في JavaScript الحديث.
عامل الانتشار ... هو الأداة الأساسية.
نسخ كائن باستخدام عامل الانتشار
انشر محتويات كائن داخل كائن جديد، ثم استبدل قيمة إحدى الخصائص. وتحتفظ النسخة الأصلية بقيمتها القديمة.
const user = { name: 'Ada', age: 36 };
const older = { ...user, age: 37 };
console.log(user.age);
console.log(older.age);إنهما كائنان مختلفان
النسخة كائن جديد تمامًا، وليست المرجع نفسه. ويؤكد ذلك اختبار مقارنة الهوية.
const original = { x: 1 };
const copy = { ...original };
console.log(original === copy);
console.log(original.x === copy.x);إضافة خاصية دون تغيير
لإضافة حقل، انشر الكائن القديم وأدرج المفتاح الجديد. ولا يطرأ أي تغيير على الكائن الأصلي.
const point = { x: 1, y: 2 };
const point3d = { ...point, z: 3 };
console.log(point);
console.log(point3d);إزالة خاصية دون تغيير
استخدم التفكيك لاستخراج المفتاح غير المرغوب فيه، والتقاط بقية الخصائص. ويستبعد كائن الباقي ذلك المفتاح.
const user = { id: 1, name: 'Ada', secret: 'x' };
const { secret, ...safe } = user;
console.log(safe);
console.log(user.secret);نسخ المصفوفات باستخدام عامل الانتشار
انشر مصفوفة لنسخها. كما تُرجع أساليب مثل map وfilter مصفوفات جديدة، ولا تغيّر المصدر مطلقًا.
const nums = [1, 2, 3];
const copy = [...nums];
const doubled = nums.map(n => n * 2);
console.log(nums);
console.log(doubled);الإضافة إلى مصفوفة دون تغيير
بدلًا من استخدام push، الذي يغيّر المصفوفة، أنشئ مصفوفة جديدة باستخدام عامل الانتشار. ويظل طول المصفوفة الأصلية كما هو.
const list = ['a', 'b'];
const added = [...list, 'c'];
const prepended = ['z', ...list];
console.log(list);
console.log(added);
console.log(prepended);الإزالة من مصفوفة دون تغيير
استخدم filter لإنتاج مصفوفة جديدة من دون العنصر غير المرغوب فيه، مع إبقاء المصفوفة الأصلية كما هي.
const nums = [1, 2, 3, 4];
const withoutThree = nums.filter(n => n !== 3);
console.log(nums);
console.log(withoutThree);تحديث الكائنات المتداخلة
تتطلب التحديثات المتداخلة استخدام عامل الانتشار في كل مستوى تغيّره. ويُعاد إنشاء الفرع الذي تم لمسه فقط، بينما تتم مشاركة بقية الفروع بالمرجع.
const state = { user: { name: 'Ada', age: 36 }, theme: 'dark' };
const updated = {
...state,
user: { ...state.user, age: 37 }
};
console.log(state.user.age);
console.log(updated.user.age);
console.log(state.theme === updated.theme);تحديث عنصر في مصفوفة
استخدم map لإرجاع نسخة متغيّرة من العنصر المطابق، والنسخة الأصلية لبقية العناصر. ولا يُغيَّر أي عنصر.
const todos = [
{ id: 1, done: false },
{ id: 2, done: false }
];
const updated = todos.map(t =>
t.id === 2 ? { ...t, done: true } : t
);
console.log(todos[1].done);
console.log(updated[1].done);لماذا تهم التحديثات دون تغيير؟
إن عدم تغيير الحالة المشتركة مطلقًا يجعل اكتشاف التغييرات قليل التكلفة (بمقارنة المراجع)، ويمكّن من التراجع والإعادة، ويمنع الأخطاء الناتجة عن التأثيرات غير المباشرة. النمط هو: انسخ، ثم غيّر النسخة. أما النسخ العميق، فيتناول الدرس التالي structuredClone.
function setName(state, name) {
return { ...state, name };
}
const s1 = { name: 'old', count: 0 };
const s2 = setName(s1, 'new');
console.log(s1.name, s2.name);تحقق سريع
ماذا ينتج { ...user, age: 37 } عندما يحتوي user مسبقًا على age؟
مراجعة: أنماط التحديث دون تغيير
لقد تعلّمت التحديث دون تغيير:
- استخدم عامل الانتشار
{ ...obj, key: value }للنسخ والاستبدال. - استخدم تفكيك كائن الباقي لإزالة خاصية دون تغيير الكائن.
- استخدم
mapوfilterوعامل انتشار المصفوفات بدلًا منpush/splice. - استخدم عامل الانتشار في كل مستوى عند تحديث البيانات المتداخلة، وشارك بقية الفروع بالمرجع.
الأسئلة الشائعة
هل درس «أنماط التحديث غير القابل للتغيير» مجاني؟
نعم — نص درس «أنماط التحديث غير القابل للتغيير» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة JavaScript Academy، انتقل إلى CoddyKit PRO. تتضمن دورة JavaScript Academy 4 دروس في المجموع.
ماذا ستتعلم في «أنماط التحديث غير القابل للتغيير»؟
حدّثوا البيانات بإنشاء نسخ جديدة. تتمرن على JavaScript Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ JavaScript Academy؟
لا تُشترط خبرة سابقة. JavaScript Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «أنماط التحديث غير القابل للتغيير»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس JavaScript Academy هذا؟
نعم. كل درس في JavaScript Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- تجميد الكائنات وإغلاقها باستخدام Object.freeze وseal
- التجميد السطحي مقابل العميق
- أنماط التحديث غير القابل للتغيير
- structuredClone للنسخ العميقة