تفاوت == و === رو میدونی ؟؟
سلام به دوستان عزیز!
تفاوت == و === رو میدونی ؟؟
امروز قراره درباره یکی از مفاهیم مهم و کاربردی جاوااسکریپت صحبت کنیم، یعنی تفاوت بین عملگر == و ===.
شاید بگی که “من میدونم چطور در جاوااسکریپت مقایسه کنم”، ولی مقایسه در جاوااسکریپت پیچیدهتر از این چیزهاست. جاوااسکریپت علاوه بر مقایسه ساده، ماجرای تبدیل نوع و تفاوتهای بین == و === رو داره که گاهی نتایج غیرمنتظرهای ایجاد میکنه.
پس برای نوشتن کد بهتر، باید بدونی دقیقاً چطور و کجا از این عملگرها استفاده کنی تا دچار مشکلات غیرقابل پیشبینی نشی!
معرفی تفاوتها:
جاوااسکریپت دو نوع عملگر برای مقایسه داره:
- عملگر ==
- عملگر ===
عملگر == (مقایسه با تبدیل نوع)
در نگاه اول شاید به نظر بیاد که این دو شبیه هم هستن، اما در واقع تفاوتهای مهمی دارن. بیاین با هم ببینیم.
وقتی از == استفاده میکنیم، جاوااسکریپت تلاش میکنه که قبل از مقایسه، نوع دادهها رو به هم نزدیک کنه یا تبدیل کنه. به این تبدیل میگیم نوعتبدیل (Type Coercion).
یه مثال بزنیم:
console.log(۵ == "5"); // true
console.log(۰ == false); // true
console.log(null == undefined); // true
تو این مثالها میبینیم که جاوااسکریپت نوعها رو تبدیل میکنه تا مقایسه انجام بشه. برای مثال، عدد ۵ با رشته “۵” مقایسه شده، اما جاوااسکریپت رشته رو به عدد تبدیل کرده و نتیجه true میشه.
اما این تبدیل نوع میتونه باعث نتایج غیرمنتظره و گاهی سردرگمی بشه.
عملگر === (مقایسه دقیق یا سختگیرانه)
در مقابل، === به عنوان مقایسه سختگیرانه یا دقیق شناخته میشه. اینجا جاوااسکریپت هیچ تبدیل نوعی انجام نمیده؛ یعنی نوع دادهها هم باید دقیقاً مشابه باشن.
یه مثال بزنیم:
console.log(۵ === "5"); // false
console.log(۰ === false); // false
console.log(null === undefined); // false
تو اینجا میبینیم که به خاطر تفاوت در نوع دادهها (مثلاً ۵ عددی و “۵” رشتهای)، نتیجه مقایسه false میشه.
کدوم رو استفاده کنیم؟
حالا سوال اینجاست: == یا ===؟
به طور کلی پیشنهاد میشه که از === استفاده کنیم. چون با استفاده از این عملگر، از هرگونه تبدیل غیرمنتظره و خطاهای احتمالی جلوگیری میکنیم. اما اگه دقیقاً بدونی که چه اتفاقی میافته و عمداً میخوای تبدیل نوع انجام بشه، اون موقع میتونی از == استفاده کنی.
یه هشدار مهم:
البته === هم همیشه دقیق نیست! مثلاً در مورد NaN و -۰، این عملگر “دروغ” میگه:
console.log(NaN === NaN); // false
console.log(۰ === -۰); // true
اینجا NaN با هیچ مقداری، حتی خودش، برابر نیست. برای رفع این مشکل، از Number.isNaN(..) استفاده کن. همچنین برای -۰ هم میتونی از Object.is(..) کمک بگیری.
Number.isNaN(NaN); // true
Object.is(NaN, NaN); // true
Object.is(۰, -۰); // false
خلاصه:
برای مقایسههای معمولی و مطمئن از === استفاده کن. اگه نیاز به تبدیل نوع داری، میتونی با دقت از = = بهره ببری.