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

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


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


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


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


جمع‌بندی


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


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

مقالات مرتبط

نحوهٔ میزبانی مستقل اپلیکیشن Next.js – پیکربندی، کشینگ، و استراتژی‌های استقرار

nextjs-self-hosting-deployment-cache-isr-proxy-env

ادامه

مقایسه‌های شرطی تبدیل‌پذیر و کلاس‌های پروتوتایپی در جاوااسکریپت – درک دقیق رفتار شرطی و ساختارهای ارث‌بری

این مقاله دو موضوع مهم از ضمیمهٔ A کتاب YDKJSY را بررسی می‌کند: نحوهٔ تبدیل نوع در عبارات شرطی مانند if و while، و الگوی کلاس‌های پروتوتایپی به‌عنوان پیش‌زمینه‌ای برای کلاس‌های ES6. با مثال‌های عملی، تفاوت بین مقایسه‌های دقیق و تبدیل‌پذیر، و نحوهٔ تفویض رفتار از طریق زنجیرهٔ پروتوتایپ روشن می‌شود.

ادامه

در جاوااسکریپت – تفاوت مقدار و مرجع، و فرم‌های متنوع تعریف تابع

در جاوااسکریپت – تفاوت مقدار و مرجع، و فرم‌های متنوع تعریف تابع

ادامه

پروتوتایپ‌ها در جاوااسکریپت – زنجیرهٔ ارجاع، تفویض ویژگی‌ها، و نقش this در رفتار پویا

پروتوتایپ‌ها در جاوااسکریپت مکانیزمی برای ارجاع ویژگی‌ها بین اشیاء هستند. این مقاله به تعریف زنجیرهٔ پروتوتایپ، نحوهٔ تفویض ویژگی‌ها، تفاوت بین دسترسی و انتساب، و نقش کلیدی this در فراخوانی متدهای ارجاع‌شده می‌پردازد. درک این مفاهیم برای طراحی شی‌گرا و رفتارهای پویا در JS ضروری است.

ادامه

Closure و this در جاوااسکریپت – حافظهٔ دامنه و زمینهٔ اجرایی در توابع

Closure و this دو مفهوم بنیادی و گاه گیج‌کننده در جاوااسکریپت هستند. این مقاله به تعریف دقیق closure به‌عنوان حافظهٔ متغیرهای بیرونی در توابع، و بررسی رفتار پویا و وابسته به نحوهٔ فراخوانی در this می‌پردازد. با مثال‌های عملی، تفاوت بین دامنهٔ ثابت و زمینهٔ اجرایی پویا روشن می‌شود.

ادامه

تکرار در جاوااسکریپت – الگوی Iterator، ساختارهای قابل‌تکرار، و مصرف استاندارد داده‌ها

تکرار در جاوااسکریپت – الگوی Iterator، ساختارهای قابل‌تکرار، و مصرف استاندارد داده‌ها

ادامه