«المتغير غير معرّف»: لماذا هذه المشكلة تؤرق الجميع؟
\n\nإذا كنت قد كتبت كودًا بلغة JavaScript ولو لمرة واحدة، فبالتأكيد واجهت هذا الموقف: تقوم بتشغيل الكود، وتظهر في وحدة التحكم رسالة حمراء Uncaught TypeError: Cannot read properties of undefined. أو الأسوأ من ذلك — null is not an object. هل يبدو ذلك مألوفًا؟ هذا واحد من أكثر الأخطاء شيوعًا التي تطارد المطورين من جميع المستويات.
سؤال «How can I determine if a variable is 'undefined' or 'null'?» على Stack Overflow حصد آلاف المشاهدات ومئات الإجابات. وهذا ليس بدون سبب: في JavaScript، هاتان القيمتان متشابهتان لكنهما تتصرفان بشكل مختلف. في عام 2025، عندما يصبح الكود أكثر تعقيدًا والمشاريع أكبر حجمًا، تتحول القدرة على التحقق بشكل صحيح من undefined و null من «من الجيد معرفتها» إلى «من الضروري إتقانها».
في هذه المقالة، سنستعرض جميع طرق التحقق، من البسيطة إلى المتقدمة، ونوضح أي الطرق يجب استخدامها في التطوير الحديث. هيا بنا!
\n\nundefined مقابل null: ما الفرق؟
\n\nقبل أن نتحقق، دعنا نفهم ما نتعامل معه. في JavaScript، undefined و null هما قيمتان بدائيتان مختلفتان، لكل منهما نوعه الخاص.
undefined
\nundefined هي القيمة التي تُسند تلقائيًا إلى المتغير إذا قمت بتعريفه ولكنك لم تعطه قيمة. كما أن الدالة ترجع undefined إذا لم تحتوي على return صريح.
let myVar;\nconsole.log(myVar); // undefined\n\nfunction doNothing() {}\nconsole.log(doNothing()); // undefined\n\nconsole.log(someNonExistentVariable); // ReferenceError، لكن عند الوصول إلى خاصية كائن:\nconst obj = {};\nconsole.log(obj.prop); // undefined\n\n\nnull
\nnull هي القيمة التي يُسندها المطور عن قصد. تعني «فارغ»، «لا شيء»، «القيمة غير موجودة». null هو كائن من وجهة نظر typeof (نعم، هذا خطأ تاريخي، لكنه أصبح ميزة).
let myVar = null;\nconsole.log(myVar); // null\nconsole.log(typeof myVar); // "object" — نعم، هذا صحيح!\n\n\nالفرق الرئيسي: undefined تعني «لم يُسند بعد»، بينما null تعني «فارغ عن قصد». لكن عند المقارنة غير الصارمة، فإنهما متساويان:
console.log(null == undefined); // true\nconsole.log(null === undefined); // false\n\n\nوبسبب هذه المساواة غير الصارمة ينشأ الارتباك. لذلك، توصي أفضل الممارسات لعام 2025 باستخدام المقارنة الصارمة (===).
أفضل 5 طرق للتحقق من undefined و null
\n\nدعنا نستعرض جميع الطرق الشائعة، من الأبسط إلى الأحدث. سنقيم كل طريقة بناءً على ثلاثة معايير: قابلية القراءة، والموثوقية، والأداء.
\n\n1. المقارنة الصارمة (===) — المعيار الذهبي
\nالطريقة الأكثر مباشرة ووضوحًا هي مقارنة المتغير مباشرة مع undefined أو null باستخدام ===.
let value = null;\n\n// التحقق من null\nif (value === null) {\n console.log('هذا هو null');\n}\n\n// التحقق من undefined\nif (value === undefined) {\n console.log('هذا هو undefined');\n}\n\n// التحقق من null أو undefined (بشكل منفصل)\nif (value === null || value === undefined) {\n console.log('القيمة غير موجودة');\n}\n\n\nلماذا هذه أفضل ممارسة؟
\n- \n
- أقصى درجات الوضوح — أي مطور سيفهم ما تتحقق منه. \n
- لا توجد تحويلات نوع غير متوقعة. \n
- تعمل في جميع إصدارات JavaScript، بما في ذلك الأقدم. \n
العيب: إذا كنت بحاجة للتحقق من كلا القيمتين معًا، فعليك كتابة شرطين. لكن يمكن حل ذلك باستخدام العامل || كما في المثال أعلاه.
2. عامل الدمج الصفري (??) — الجديد الذي أثبت نفسه
\nبدءًا من ES2020، ظهر في JavaScript العامل ?? (nu