در جاوااسکریپت دو عملگر برابری هست و تفاوتشان یک نویسه است. عملگر سهنویسهای نوع را هم مقایسه میکند و عملگر دونویسهای پیش از مقایسه تبدیل میکند. مشکل دومی این نیست که سخت است، این است که یک رابطه ریاضی درست نمیسازد:
0 == ""نتیجهtrue0 == "0"نتیجهtrue"" == "0"نتیجهfalse
یعنی دو چیز که هر دو با یک چیز سوم برابرند، با هم برابر نیستند. هر قاعدهای که بخواهید برای این عملگر به خاطر بسپارید با همین سه سطر شکسته میشود، و به همین دلیل جواب درست یاد گرفتن قاعده نیست، استفاده نکردن است.
یک استثنا هست و فقط یکی: x == null همزمان null و undefined را میگیرد و هیچ چیز دیگری را. برای «مقدار داده نشده» همین را بنویسید و در بقیه جاها سهنویسهای.
سه غافلگیری دیگر که با نوعها ربط دارند
typeof null رشته "object" برمیگرداند، که یک باگ تاریخی است و هیچوقت درست نشد چون کد موجود را میشکست. پس برای تشخیص null از این عملگر استفاده نکنید و مستقیم مقایسه کنید.
جمع عددهای اعشاری همان چیزی است که در هر زبانی هست ولی اینجا بیشتر دیده میشود: 0.1 + 0.2 برابر 0.30000000000000004 است. برای پول هرگز عدد اعشاری نگه ندارید و بهجایش ریال را بهشکل عدد صحیح بشمارید. و [] == false نتیجه true میدهد، که نمونه سوم همان زنجیره تبدیل است.
let و const، و متغیری که بالا میرود
از سال ۲۰۱۵ به بعد var دیگر نوشته نمیشود. دلیلش دامنه است: var دامنه تابعی دارد و از بلوک بیرون میزند، پس متغیری که داخل یک if تعریف کردهاید بعد از آن هم وجود دارد. let و const دامنه بلوکی دارند و همان چیزی هستند که از هر زبان دیگری انتظار دارید. پیشفرض را const بگذارید و فقط جایی که واقعا مقدار عوض میشود let؛ این دو خط، بیشترین کاهش را در باگهای دامنهای میدهند.
جایی که کار گیر میکند، آموزشهای قدیمی است
بیشتر آموزشهای ویدیویی فارسی جاوااسکریپت پیش از سال ۲۰۲۰ ضبط شدهاند و هنوز پرتماشاتریناند. کدی که در آنها نوشته میشود var دارد، برای هر کار از jQuery استفاده میکند و برابری سست را عادی میداند. کسی که از آنها شروع میکند زبان را یاد میگیرد ولی نسخهای از آن را که ده سال قدیمی است، و بعد در اولین بازبینی کد یا اولین مصاحبه با فاصلهاش روبهرو میشود. سریعترین راه بستن این فاصله سه چیز است: const بهجای var، سهنویسهای بهجای دونویسهای، و رشته قالبی بهجای چسباندن رشته با علامت جمع.
ابزار، و سالی که این حرف درست است
در سال ۲۰۲۶، ابزار پیشفرض برای گرفتن همین دسته خطاها پیش از اجرا ESLint است، متنباز و رایگان، و قاعدهای دارد که برابری سست را بهجز همان یک حالت null علامت میزند. برای اجرای کد بیرون از مرورگر، Node.js 24 در سال ۲۰۲۶ خط پشتیبانی بلندمدت است و جانشین Node.js 22 شد. هر دو نصب میخواهند، اما پس از نصب برای همین آزمونها به شبکه نیازی ندارند.
پرسش بعدی این است که چطور میشود این نوعها را پیش از اجرا اجباری کرد، که نوعها روی جاوااسکریپت، و چیزی که میگیرند است. و اولین جایی که این زبان واقعا کاری میکند، صفحهای است که در مرورگر باز است: خواندن و تغییر صفحه از داخل اسکریپت.