مقایسه‌های تبدیل‌پذیر در جاوااسکریپت – از == تا < و تفاوت نوع‌ها

تبدیل نوع (coercion) یکی از ارکان اصلی زبان جاوااسکریپت است و در مقایسه‌ها نقش مهمی دارد. این مقاله به بررسی رفتار عملگر == به‌عنوان «مساوی تبدیل‌پذیر»، تفاوت آن با ===، و نحوهٔ عملکرد عملگرهای رابطه‌ای مانند < و > در مواجهه با نوع‌های متفاوت می‌پردازد. همچنین به موارد خاصی مانند مقایسهٔ رشته‌ها و عددها اشاره می‌شود.

تبدیل-نوعمقایسه-تبدیل‌پذیرعملگرهای-رابطه‌ای

~2 دقیقه مطالعه • بروزرسانی ۲۸ مهر ۱۴۰۴

مقدمه


تبدیل نوع (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 می‌شود — حتی اگر از نظر عددی انتظار دیگری داشته باشیم.


اجتناب یا آگاهی؟


شاید فکر کنید که همیشه باید از == اجتناب کرده و فقط از === استفاده کنید. اما عملگرهای رابطه‌ای و شرطی نیز تبدیل نوع انجام می‌دهند، و اجتناب کامل از آن‌ها عملی نیست.


راه بهتر این است که به‌جای اجتناب، رفتار تبدیل‌پذیر را بشناسیم و آگاهانه از آن استفاده کنیم.


جمع‌بندی


مقایسه‌های تبدیل‌پذیر در جاوااسکریپت بخشی جدایی‌ناپذیر از زبان هستند. عملگر == ابتدا نوع‌ها را هماهنگ می‌کند، سپس مقایسه را انجام می‌دهد. عملگرهای رابطه‌ای نیز در صورت نیاز تبدیل انجام می‌دهند. شناخت این رفتارها به شما کمک می‌کند کدی دقیق‌تر و قابل‌پیش‌بینی‌تر بنویسید.


نوشته و پژوهش شده توسط دکتر شاهین صیامی