مقدمة: لماذا "true" لا تساوي true؟
\n\nتخيل موقفًا: أنت تكتب الواجهة الأمامية لمتجر إلكتروني. يختار المستخدم خيار "تلقي الإشعارات عبر البريد الإلكتروني"، ويقوم الكود الخاص بك بحفظه في localStorage كسلسلة نصية "true". في الزيارة التالية، تقرأ هذه السلسلة وتحاول التحقق من الشرط:
let userPref = localStorage.getItem('notifications');\nif (userPref) {\n // تفعيل الإشعارات\n}\n\n\nوهنا المفاجأة — الشرط يعمل دائمًا! حتى لو كانت السلسلة النصية في localStorage هي "false"، فإن JavaScript يعتبرها قيمة truthy (صحيحة). ليس لأنك فعلت شيئًا خاطئًا، ولكن لأن أي سلسلة نصية غير فارغة في JS هي true.
هذه المشكلة شائعة جدًا لدرجة أن السؤال على Stack Overflow حصد آلاف المشاهدات وعشرات الحلول. اليوم سنفهم نهائيًا كيفية تحويل سلسلة نصية إلى boolean في JavaScript بشكل صحيح، وسنستعرض 5 طرق عملية ونحدد أفضلها.
\n\nلماذا لا يمكن ببساطة استخدام if()؟
\n\nدعنا نغلق هذا السؤال فورًا. يعتقد العديد من المبتدئين: "إذا كتبت if(str)، فإن السلسلة النصية "false" ستتحول إلى false". هذا اعتقاد خاطئ خطير.
في JavaScript، هناك مفهوم القيم falsy (الخاطئة). هناك 6 قيم فقط:
\n- \n
false\n 0(صفر) \n ""(سلسلة نصية فارغة) \n null\n undefined\n NaN\n
كل ما عدا ذلك هو truthy. السلسلة النصية "false" ليست فارغة، بل تحتوي على 5 أحرف. لذلك فهي truthy. نفس الشيء مع "0" و "null" وحتى "undefined". التحويل البسيط عبر if() أو Boolean() لن يعمل مع السلاسل النصية.
أفضل 5 طرق لتحويل سلسلة نصية إلى boolean
\n\nلقد اختبرنا جميع الطرق الشائعة من المناقشات على Stack Overflow والمشاريع الحقيقية. إليك هذه الطرق، من الأسوأ إلى الأفضل.
\n\nالطريقة 1: العامل الثلاثي (الأكثر وضوحًا، لكنه متضخم)
\n\nfunction stringToBoolean(str) {\n return str === 'true' ? true : str === 'false' ? false : null;\n}\n\nconsole.log(stringToBoolean('true')); // true\nconsole.log(stringToBoolean('false')); // false\nconsole.log(stringToBoolean('yes')); // null\n\n\nالميزة: واضح للمبتدئين.
\nالعيب: الكود يتضخم إذا كنت بحاجة لمعالجة "yes" أو "1" أو "on". ستحتاج لكتابة سلسلة من الشروط.
الطريقة 2: JSON.parse() (أنيق، لكنه صارم)
\n\nfunction stringToBoolean(str) {\n try {\n return JSON.parse(str);\n } catch (e) {\n return null;\n }\n}\n\nconsole.log(stringToBoolean('true')); // true\nconsole.log(stringToBoolean('false')); // false\nconsole.log(stringToBoolean('TRUE')); // خطأ! سيعيد null\n\n\nطريقة JSON.parse() قادرة على تحليل السلاسل النصية "true" و "false" إلى قيم منطقية. لكن هناك فارق بسيط: إنها حساسة لحالة الأحرف. "True" أو "TRUE" ستسبب خطأ. لكن JSON.parse("null") سيعيد null وليس false — قد يكون هذا مفيدًا.
الطريقة 3: التعبير المنتظم (مرن، لكنه بطيء)
\n\nfunction stringToBoolean(str) {\n if (typeof str !== 'string') return null;\n return /^(true|yes|1|on)$/i.test(str.trim());\n}\n\nconsole.log(stringToBoolean('true')); // true\nconsole.log(stringToBoolean('YES')); // true\nconsole.log(stringToBoolean('off')); // false\nconsole.log(stringToBoolean('0')); // false\n\n\nهنا نستخدم العلم i (غير حساس لحالة الأحرف) ونعالج عدة متغيرات من "الحقيقة": true و yes و 1 و