«Uncaught ReferenceError» — عدوك الأول؟ تعلم التحقق من undefined بشكل صحيح في JavaScript
\n\nكل من كتب في JavaScript ولو سطرين، واجه الغامض undefined. إنه ليس مجرد «مكان فارغ» — بل هو نوع بيانات كامل بقيمة خاصة به. ولكن كيف تلتقطه بشكل صحيح؟ إذا كنت قد بحثت عن «How can I check for undefined in JavaScript»، فأنت لست وحدك: هذا السؤال على Stack Overflow حصد مئات الآلاف من المشاهدات. المشكلة هي أن هناك عدة طرق للتحقق في JS، وكل منها يحمل مخاطر خفية.
في هذه المقالة، سنستعرض 5 طرق، من البسيط إلى المعقد، ونقارن أداءها وموثوقيتها، ونكتشف أي طريقة يجب استخدامها في عام 2025. هيا بنا!
\n\nما هو undefined في الحقيقة؟
\n\nقبل أن نتحقق، دعنا نتفق على المصطلحات. undefined هي قيمة بدائية تُعطى لمتغير إذا تم تعريفه ولكن لم تتم تهيئته:
let a;\nconsole.log(a); // undefined\n\n\nهام: undefined ≠ null ≠ not defined. null هو «لا شيء» مقصود، و not defined (ReferenceError) يحدث عندما لا يتم تعريف المتغير على الإطلاق. هذه الفروق الدقيقة حاسمة لاختيار التحقق الصحيح.
الطريقة رقم 1: العامل typeof — المعيار الذهبي؟
\n\nالطريقة الأكثر شيوعًا وأمانًا هي استخدام typeof:
if (typeof x === 'undefined') {\n console.log('x غير معرف');\n}\n\n\nلماذا يعمل هذا حتى مع المتغيرات غير المعلنة؟ typeof لا يرمي خطأ ReferenceError أبدًا. إذا كان المتغير غير موجود، فإنه ببساطة يُرجع السلسلة النصية "undefined".
الإيجابيات:
\n- \n
- آمن للمتغيرات غير المعلنة \n
- كود قابل للقراءة والفهم \n
- يعمل في جميع المتصفحات والبيئات (Node.js, Deno) \n
السلبيات:
\n- \n
- طويل نسبيًا للاستخدام المتكرر \n
- قد يضلل المبتدئين (مقارنة نصية) \n
الحكم: أفضل خيار للتحقق العام وفي الحالات التي قد لا يكون فيها المتغير معلنًا.
\n\nالطريقة رقم 2: المقارنة الصارمة مع undefined (===)
\n\nالطريقة الثانية من حيث الشهرة هي مقارنة القيمة مباشرة:
\n\nif (x === undefined) {\n console.log('x يساوي undefined');\n}\n\n\nهناك فارق بسيط هنا: يجب أن يكون المتغير معلنًا. إذا كان x غير موجود، ستحصل على خطأ ReferenceError. لذلك هذا الكود آمن فقط لـ:
\n- \n
- خصائص الكائنات (
obj.prop === undefined) \n - معاملات الدوال \n
- المتغيرات المعلنة عبر
letأوconstأوvar\n
المزلق: undefined العام
\nفي المتصفحات القديمة (IE 8 وما دونه) كان يمكن إعادة تعريف undefined:
undefined = 'أنا الآن سلسلة نصية'; // كابوس!\n\nهذا غير ممكن الآن (في الوضع الصارم)، ولكن إذا كنت تدعم كودًا قديمًا — فاستخدم typeof بدلاً من ذلك.
الحكم: طريقة ممتازة للمتغيرات المحلية وخصائص الكائنات. سريعة وموجزة.
\n\nالطريقة رقم 3: العامل void
\n\nطريقة غير معروفة ولكنها أنيقة — void 0:
if (x === void 0) {\n console.log('x undefined');\n}\n\n\nالعامل void يحسب التعبير ويعيد undefined. void 0 هو أقصر طريقة للحصول على undefined نقي، غير معتمد على المتغير العام.
متى يكون هذا مفيدًا؟
\n- \n
- في الكود المصغر (يوفر بايتات) \n
- في المكتبات حيث الحماية من إعادة تعريف
undefinedمهمة \n - في البرمجة الوظيفية (مثل سلاسل الـ Promises) \n
العيب: يبدو غريبًا