مستوى المقال: مبتدئ. لو لسه في أول الطريق مع جافاسكريبت وبتتلخبط إمتى تكتب == وإمتى ===، المقال ده هيوريك اللي بيحصل تحت بالظبط، وهيوقّف عنك مفاجآت زي إن 0 == "" بترجّع true.
في جملة واحدة: == بيحوّل نوع القيم قبل ما يقارن، و=== بيقارن من غير أي تحويل. الفرق ده بيخبّي أخطاء بتعدّي من غير ما تاخد بالك، خصوصًا وانت بتتحقق من مدخلات المستخدم.
الفرق في سطر واحد قبل ما نغرق في التفاصيل
=== اسمه المساواة الصارمة (strict equality): لو النوع مختلف، النتيجة false على طول. == اسمه المساواة الفضفاضة (loose equality): لو النوع مختلف، بيحاول يوحّد النوع الأول وبعدين يقارن. المشكلة إن قواعد التوحيد دي مش بديهية، وده مصدر البق.
المشكلة باختصار
معظم المبتدئين بيكتبوا == بالعادة لأنها أقصر. بعدين بيتفاجئوا إن شرط زي if (input == false) بيتحقق مع قيم متوقعتهاش خالص: السلسلة الفاضية، الرقم صفر، وحتى مصفوفة فاضية. النتيجة: تحقق بيسمح بمدخل غلط، أو بيرفض مدخل صح.
الأول بمثال: مترجم على الحدود
تخيّل حدود بين بلدين. البلد الأولى بتتكلم أرقام، والتانية بتتكلم كلام. عايز تعرف هل الرسالة اللي جاية من هنا بتساوي الرسالة اللي جاية من هناك.
لو استخدمت ===، الحارس بيبصّ ويقول: "دي بتتكلم أرقام ودي بتتكلم كلام، مختلفين، خلاص مش متساويين". قرار سريع وواضح.
لو استخدمت ==، الحارس بيجيب مترجم. المترجم بياخد الرسالة الكلامية ويحوّلها لأرقام عشان يقدر يقارن. المشكلة إن المترجم ده بيتصرّف بقواعد غريبة: بيعتبر السلسلة الفاضية "" تساوي صفر، وبيعتبر الكلمة "0" برضه تساوي صفر. فيطلعلك إن حاجتين شكلهم مختلف تمامًا "متساويين".
المترجم هنا هو الـ Type Coercion: التحويل الضمني للنوع اللي جافاسكريبت بتعمله من ورا ظهرك.
دلوقتي بشكل علمي: خوارزمية المساواة المجرّدة
لما تكتب a == b، المواصفة (ECMAScript) بتمشي على خطوات محددة اسمها الـ Abstract Equality Comparison. المهم فيها:
- لو النوعين زي بعض، بتتصرّف زي
===بالظبط. - لو رقم مع سلسلة، السلسلة بتتحوّل لرقم.
- لو أي طرف
boolean، بيتحوّل لرقم الأول (trueتبقى 1 وfalseتبقى 0). - لو object مع رقم أو سلسلة، الـ object بيتحوّل لقيمة بدائية (نص أو رقم).
nullوundefinedبيساووا بعض بس، ومش بيساووا أي حاجة تانية.
الافتراض هنا إننا بنتكلم عن جافاسكريبت في المتصفح أو Node، وده السلوك القياسي المتوافق مع المواصفة، مش خاص بمكتبة معينة.