ما باید درک کنیم که `==` بیشتر از آن استفاده نکنید.

اگر تا به حال فکر کرده اید که چرا ==
به روشی که در JavaScript انجام می دهد رفتار می کند ، شما تنها نیستید. در ==
اپراتور ، همچنین به عنوان اپراتور برابری سست، یک راز دارد: مقایسه های عددی را ترجیح می دهد. این ممکن است در ابتدا عجیب به نظر برسد ، اما وقتی فهمید که چگونه کار می کند ، خواهید دید که چرا این رفتار وجود دارد و چگونه می توان از آن به طور مؤثر استفاده کرد.
ترجیح عددی
با توجه به مشخصات ECMAScript ، ==
اپراتور دنبال می کند الگوریتم مقایسه برابریبشر این الگوریتم دارای تعصب روشنی است: ترجیح می دهد قبل از مقایسه آنها مقادیر را به اعداد تبدیل کند. در اینجا نحوه عملکرد آن آورده شده است:
- اگر یک مقدار a باشد شماره و دیگری رشته، رشته به یک عدد تبدیل می شود.
- اگر یک مقدار a باشد بولی، به یک شماره تبدیل شده است (
true
می شود1
باfalse
می شود0
). - اگر یک مقدار یک باشد اعتراض (مانند یک آرایه) ، با استفاده از یک بدوی تبدیل می شود
ToPrimitive
عمل ، و روند تکرار می شود.
این بدان معنی است که هنگام استفاده ==
، JavaScript غالباً بیشتر از آنچه که متوجه می شوید کارهای بیشتری را در زیر کاپوت انجام می دهد. این فقط مقایسه ارزش هایی نیست که سعی می کند در ابتدا آنها را به شماره ها بسازد.
چرا این موضوع مهم است؟
درک این ترجیح عددی می تواند به شما در پیش بینی چگونگی ==
در سناریوهای مختلف رفتار خواهد کرد. به عنوان مثال:
console.log(5 == "5"); // true
در اینجا ، رشته "5"
به شماره تبدیل می شود 5
، و مقایسه موفق می شود. اما اگر استفاده می کنید ===
، انواع باید مطابقت داشته باشند ، بنابراین باز می گردد false
بشر
این رفتار تصادفی نیست بلکه برای آسان تر مقایسه های خاص طراحی شده است. به عنوان مثال ، اگر یک عدد را با یک نمایش رشته ای از آن شماره مقایسه می کنید ، ==
بدون نیاز به تبدیل نوع صریح ، می تواند آن را اداره کند.
چه موقع ==
منطقی است؟
در حالی که ===
به طور کلی ایمن تر است ، مواردی وجود دارد که ==
می تواند مفید باشد به عنوان مثال ، اگر در حال کار با داده هایی هستید که ممکن است به عنوان یک رشته یا یک شماره وارد شود (مانند ورودی کاربر از یک فرم) ، ==
می تواند کد شما را ساده کند:
function isAnswerCorrect(userInput, correctAnswer) {
return userInput == correctAnswer;
}
console.log(isAnswerCorrect("42", 42)); // true
در اینجا ==
به عملکرد اجازه می دهد تا ورودی های رشته و شماره را بدون منطق نوع بررسی اضافی کنترل کند.
تصویر بزرگتر
غذای اصلی این است که ==
ذاتاً بد نیست ، فقط یک ابزار است. مسئله واقعی هنگامی بوجود می آید که شما از آن به روش هایی استفاده می کنید که منطقی نباشد ، مانند مقایسه یک شماره با یک آرایه:
console.log(42 == [42]); // true
این کار می کند زیرا آرایه به یک رشته تبدیل شده است ("42"
) ، که سپس به یک عدد تبدیل می شود (42
). اما فقط به این دلیل که کار می کند به معنای ایده خوبی نیست. مشکل اینجا نیست ==
این مقایسه مزخرف است.
در ==
اپراتور در JavaScript ترجیح عددی دارد و درک این امر می تواند به شما در نوشتن کد بهتر و قابل پیش بینی تر کمک کند. در حالی که ===
اغلب انتخاب امن تر است ، ==
می تواند در سناریوهای خاص که در آن اجبار نوع عمدی و به خوبی درک شده است ، مفید باشد ، ما باید برای استفاده از آن باز باشیم زیرا بخشی از زبان است.