هممون میدونیم توی جاوااسکریپت برای بررسی مساوی بودن دو مقدار باید از === یا == استفاده کنیم. از هر جیاس دولوپری هم بپرسی تفاوت اینا چیه میگن === تایپ طرفین رو هم بررسی میکنه ولی == فقط مقدار طرفین رو بررسی میکنه. بیاین یه کار جالب بکنیم. بیاین از توی spec پیاده سازی عملوند های === و == رو ببینیم و بعدش به قسمتای عجیبش نگاه بندازیم.
برای == داریم:
و برای === داریم:
خب، اولین نکته جالب اینه که وقتی از == استفاده میکنیم تایپ متغیر ها چک میشه، بر خلاف نظر عمومی که تایپها بررسی نمیشن. اگه یکسان باشت === براشون صدا زده میشه.
توی === باید بدونیم که دوتا دروغی که مساویها بهمون میگن تو جاوااسکریپت همینجان. NaN و -0. بعدا مفصل بهشون میپردازیم و میگیم چه مواقعی حواسمون باشه گیرش نیفتیم.
به == که دقت کنیم میبینیم هر کدوم از متغیرهامون null یه undefined باشن false میشه. پس میتونیم بجای بررسی جفتش با === اونارو با یکیش و با == بررسی کنیم. یعنی وقتی همزمان میخوایم چک کنیم variable === undefined || variable === null میتونیم فقط چک کنیم variable == null. طبق پیاده سازی == میبینیم که برای مقایسه مقدار، تایپهای دیگه رو تبدیل به عدد میکنه. برای آبجگتها میبینیم که toPrimitive صدا زده میشه، و بعد از اینکه به تایپ پایهشون رسیدن مقایسه میشن. toPrimitive رو مفصل توی این پست گفتم.
خب، بیاین چند نمونه از کارای عجیب جاوااسکریپت ببینیم.
با 42 == [42] شروع کنیم که true برمیگرده. برای چراییش به یه بخشی از پست قبلی اشاره میکنم، سریالایز شدن آرایه. یعنی [42] میشه "42" که 42 == "42" قطعا true میشه.
یه نمونه دیگه میشه به [] =! [] اشاره کرد که true میشه. چون همینو میشه به صورت ([] == [])! که میشه (false)! پس true میشه. اینجا باید به این دقت کنیم که تو آبجکتها وقتو دو آبجکت شبیه هم داریم ولی از یک منبع کپی نشدن، == بینشون false برمیگرده. یعنی اگه عینا به یه ادرس مموری اشاره نکنن == بینشون false میشه. اینو میشه تو مثال بالا هم دید که دو آرایه خالی، که عین همن، ولی چون از یک منبع کپی نشدن و به دو آدرس مختلف از مموری اشاره میکنن [] == [] میشه false.
در آخر باید بگم که کلا این که === رو اولویت میدیم بهش یا == خیلی سلیقهایه، ولی مهم اینه که به کدمون و به تایپهاش اشراف داشته باشیم. تمام حالاتی که "مجبور" میشیم از === استفاده کنیم میتونیم به سادگی با انجام تبدیل تایپها قبلش یا بررسی و چک کردن تایپها قبلش از == استفاده کنیم. این که با کدوم استایل کد زدن رو ترجیح میدیم به سلیقمون/سلیقه تیممون برمیگرده. فقط لازمه کدو بشناسیم و عملکرد دقیق == و === رو بدونیم.