تجنّب التعديل المباشر
اعملوا على نسخ بدلًا من تعديل البيانات مباشرةً.
تجنّب التعديل المباشر درس مجاني في JavaScript Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في JavaScript Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة JavaScript Academy 4 دروس في المجموع.
لماذا نتجنب التغيير
يؤدي تغيير البيانات المشتركة إلى أخطاء يصعب تتبعها؛ إذ يفاجئ تغيير في موضع ما الشيفرة الموجودة في موضع آخر. ويفضّل الأسلوب الوظيفي إنشاء قيم جديدة بدلًا من تعديل القيم الموجودة (عدم قابلية التغيير).
const original = [1, 2, 3];
const copy = [...original, 4];
console.log(original); // [1, 2, 3]
console.log(copy); // [1, 2, 3, 4]استخدام spread لنسخ المصفوفات
ينشئ عامل الانتشار ... نسخة سطحية من المصفوفة، مما يتيح لك إضافة عناصر دون لمس المصدر.
const nums = [1, 2, 3];
const more = [...nums, 4, 5];
console.log(more); // [1, 2, 3, 4, 5]
console.log(nums); // [1, 2, 3]استخدام spread لنسخ الكائنات
يعمل spread مع الكائنات أيضًا، إذ ينتج كائنًا جديدًا بالخصائص نفسها، بالإضافة إلى أي تجاوزات تحددها.
const user = { name: "Ada", age: 36 };
const older = { ...user, age: 37 };
console.log(older); // { name: "Ada", age: 37 }
console.log(user); // unchangedأساليب المصفوفات غير المغيِّرة
فضّل الأساليب التي تُرجع مصفوفات جديدة، مثل map وfilter وconcat وslice. وتجنب الأساليب التي تغيّر المصفوفة، مثل push وsplice وsort في موضعها.
const a = [3, 1, 2];
const sorted = [...a].sort((x, y) => x - y);
console.log(sorted); // [1, 2, 3]
console.log(a); // [3, 1, 2]الإضافة دون تغيير
بدلًا من push، أنشئ مصفوفة جديدة باستخدام spread أو concat.
const list = [1, 2];
const added = [...list, 3]; // not list.push(3)
console.log(added); // [1, 2, 3]الحذف دون تغيير
استخدم filter لإنتاج مصفوفة جديدة من دون عنصر معين، بدلًا من splice.
const list = [1, 2, 3, 4];
const without3 = list.filter((n) => n !== 3);
console.log(without3); // [1, 2, 4]تحديث عنصر دون تغيير
لتغيير عنصر واحد، طبّق map على المصفوفة وأرجع قيمة جديدة للعنصر المطابق.
const todos = [{ id: 1, done: false }, { id: 2, done: false }];
const updated = todos.map((t) =>
t.id === 1 ? { ...t, done: true } : t
);
console.log(updated[0].done); // trueالنسخ السطحي مقابل العميق
ينسخ spread مستوى واحدًا بعمق. أما الكائنات المتداخلة فتبقى مراجع مشتركة. ولتحديث البيانات المتداخلة دون تغيير، استخدم spread في كل مستوى تغيّره.
const state = { user: { name: "Ada", age: 36 } };
const next = {
...state,
user: { ...state.user, age: 37 }
};
console.log(state.user.age); // 36
console.log(next.user.age); // 37التجميد من أجل الأمان
يمنع Object.freeze التغيير العرضي لكائن أثناء التشغيل، مما يجعل عدم قابلية التغيير صريحة، لكن ذلك يقتصر على مستوى واحد.
const config = Object.freeze({ env: "prod" });
config.env = "dev"; // ignored in non-strict mode
console.log(config.env); // "prod"لا يعني const عدم قابلية التغيير
من الالتباسات الشائعة أن const يمنع إعادة إسناد المتغير فقط، ولا يمنع تغيير القيمة التي يحملها. فلا يزال من الممكن إضافة عناصر إلى مصفوفة معلنة باستخدام const.
const arr = [1, 2];
arr.push(3); // allowed - value mutated
console.log(arr); // [1, 2, 3]
// arr = [] would throwمراجعة الفوائد
تجعل التحديثات التي لا تغيّر القيم تتبع التغييرات أمرًا بسيطًا، من خلال مقارنة المراجع، وتتيح التراجع والإعادة، وتمنع الآثار غير المتوقعة عن بُعد، وتنسجم طبيعيًا مع الدوال النقية.
const prev = { count: 0 };
const next = { ...prev, count: 1 };
console.log(prev === next); // false - easy to detect changeتحقق سريع
تجنب التغيير.
مراجعة
يعني عدم قابلية التغيير إنشاء قيم جديدة بدلًا من تغيير القيم الموجودة. استخدم spread لنسخ المصفوفات والكائنات، وفضّل الأساليب غير المغيِّرة مثل map وfilter وconcat، واستخدم spread في كل مستوى عند تحديث البيانات المتداخلة. تذكّر أن const يمنع إعادة الإسناد لا التغيير، بينما يضيف Object.freeze حماية أثناء التشغيل. تجعل التحديثات التي لا تغيّر القيم اكتشاف التغييرات وكتابة الشيفرة النقية أمرين سهلين.
الأسئلة الشائعة
هل درس «تجنّب التعديل المباشر» مجاني؟
نعم — نص درس «تجنّب التعديل المباشر» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- الدوال النقية والآثار الجانبية
- تحويل البيانات بطريقة تصريحية
- تجنّب التعديل المباشر
- النمط الخالي من الوسائط