تبدیل نوع (coercion) یعنی تبدیل یک مقدار از نوعی به نوع دیگر تا حد امکان. در جاوااسکریپت، این ویژگی نهتنها قابل اجتناب نیست، بلکه یکی از پایههای طراحی زبان است. وقتی تبدیل نوع با مقایسه ترکیب میشود، ممکن است باعث سردرگمی شود — بهویژه با عملگر ==.
عملگر == که بهعنوان «مساوی سست» شناخته میشود، اغلب بهدلیل رفتارهای غیرمنتظره مورد انتقاد قرار میگیرد. اما برخلاف تصور رایج، این عملگر نوع مقادیر را نادیده نمیگیرد — بلکه ابتدا تلاش میکند نوعها را یکسان کند، سپس مقایسه را انجام دهد.
42 == "42"; // true
1 == true; // trueدر این مثالها، رشته و بولی به عدد تبدیل میشوند، سپس مقایسه انجام میشود. دانستن این رفتار باعث میشود از موارد مشکلساز مانند "" == 0 یا 0 == false دوری کنیم.
عملگرهای رابطهای مانند < و > نیز در صورت تفاوت نوعها، تبدیل انجام میدهند — معمولاً به عدد:
var arr = ["1", "10", "100", "1000"];
for (let i = 0; i < arr.length && arr[i] < 500; i++) {
// اجرا میشود ۳ بار
}در این حلقه، مقایسهٔ arr[i] < 500 باعث تبدیل رشتهها به عدد میشود. مقایسهها بهترتیب 1 < 500، 10 < 500، 100 < 500 و 1000 < 500 هستند — که مورد آخر false است و حلقه متوقف میشود.
اگر هر دو مقدار رشته باشند، مقایسه بهصورت لغتنامهای انجام میشود:
var x = "10";
var y = "9";
x < y; // true — مراقب باشید!در این حالت، چون "1" از "9" کوچکتر است، نتیجه true میشود — حتی اگر از نظر عددی انتظار دیگری داشته باشیم.
شاید فکر کنید که همیشه باید از == اجتناب کرده و فقط از === استفاده کنید. اما عملگرهای رابطهای و شرطی نیز تبدیل نوع انجام میدهند، و اجتناب کامل از آنها عملی نیست.
راه بهتر این است که بهجای اجتناب، رفتار تبدیلپذیر را بشناسیم و آگاهانه از آن استفاده کنیم.
مقایسههای تبدیلپذیر در جاوااسکریپت بخشی جداییناپذیر از زبان هستند. عملگر == ابتدا نوعها را هماهنگ میکند، سپس مقایسه را انجام میدهد. عملگرهای رابطهای نیز در صورت نیاز تبدیل انجام میدهند. شناخت این رفتارها به شما کمک میکند کدی دقیقتر و قابلپیشبینیتر بنویسید.