«هل هذا نص؟» — سؤال يقلق كل مطور JavaScript
\n\nأنت تكتب الكود، وفجأة تتوقف. يبدو أن المتغير يجب أن يحتوي على نص، لكن ماذا لو وصل إليه null؟ أو رقم؟ أو الأسوأ من ذلك، undefined؟
هل هذا مألوف؟ إذا كان الأمر كذلك، فأنت لست وحدك. سؤال «Check if a variable is a string in JavaScript» هو واحد من أكثر الأسئلة شيوعًا على Stack Overflow مع عشرات الآلاف من المشاهدات. وهذا ليس من قبيل الصدفة: JavaScript هي لغة ذات كتابة ديناميكية، والأخطاء المتعلقة بالأنواع تحدث حتى لدى المطورين ذوي الخبرة.
\n\nفي هذه المقالة، سنستعرض جميع الطرق الممكنة للتحقق مما إذا كان المتغير نصًا. ستتعلم:
\n- \n
- لماذا
typeofهو أفضل صديق لك (ولكن ليس دائمًا) \n - متى يخذلك
instanceof\n - كيف تعمل طريقة «القناص»
Object.prototype.toString\n - وماذا تفعل إذا كنت تستخدم المكتبات \n
هيا بنا! 🚀
\n\nالطريقة رقم 1: typeof — الكلاسيكية
\n\nأبسط وأسرع طريقة هي عامل typeof. يقوم بإرجاع سلسلة نصية باسم النوع:
const name = "أليسا";\nconst age = 25;\nconst isAdmin = true;\n\nconsole.log(typeof name); // "string"\nconsole.log(typeof age); // "number"\nconsole.log(typeof isAdmin); // "boolean"\n\nالتحقق من النص يكون كالتالي:
\n\nif (typeof variable === "string") {\n console.log("نعم، هذا نص!");\n}\n\nالمزايا:
\n- \n
- يعمل بسرعة \n
- لا يتطلب استيرادًا \n
- سهل القراءة \n
العيوب:
\n- \n
- لا يفرق بين النص البدائي
"نص"وكائنnew String("نص")\n - بالنسبة لـ
nullيُرجع"object"(خطأ تاريخي في JavaScript) \n
بالمناسبة، بخصوص null — هذا خطأ معروف في اللغة لن يتم إصلاحه حتى لا يتم كسر المواقع القديمة. لذا typeof null === "object" أمر طبيعي.
وماذا عن new String()؟
\n\nفي JavaScript هناك نوعان من النصوص: بدائية (عادية) وكائنات (تم إنشاؤها عبر new String()). عمليًا، لن تستخدم new String() أبدًا تقريبًا، لكن من الجيد معرفتها:
const primitiveString = "مرحبًا";\nconst objectString = new String("مرحبًا");\n\nconsole.log(typeof primitiveString); // "string"\nconsole.log(typeof objectString); // "object"\n\nإذا قام شخص ما (أو شيء ما) في الكود الخاص بك بتمرير نص كائن، فسوف يخدعك typeof. لكن لا تقلق: في المشاريع الحقيقية، هذا نادر الحدوث.
الطريقة رقم 2: instanceof — للنصوص الكائنية
\n\nعامل instanceof يتحقق مما إذا كان الكائن مثيلًا لفئة معينة:
const str = new String("اختبار");\nconsole.log(str instanceof String); // true\n\nconst str2 = "اختبار";\nconsole.log(str2 instanceof String); // false — لأنه بدائي\n\nكما ترى، instanceof لا يعمل مع النصوص البدائية. لذلك نادرًا ما يُستخدم — فقط إذا كنت متأكدًا من أنك تتعامل مع كائنات.
متى قد يكون مفيدًا؟ إذا كنت تكتب مكتبة تقبل كلًا من البدائيات والكائنات. لكن في 99% من الحالات، سيكون typeof كافيًا.
الطريقة رقم 3: Object.prototype.toString.call() — الجندي العالمي
\n\nهذه الطريقة هي قناص حقيقي. تعمل مع أي نوع بيانات ولا تخطئ أبدًا:
\n\nfunction isString(value) {\n return Object.prototype.toString.call(value) === "[object String]";\n}\n\nconsole.log(isString("مرحبًا")); // true\nconsole.log(isString(new String("مرحبًا"))); // true\nconsole.log(isString(123)); // false\nconsole.log(isString(null)); // false\nconsole.log(isString(undefined)); // false\n\n
المدونات
توصيات الكتب
اقرأ أيضًا