Faragiri

همهٔ زبان‌ها

آموزش پایه‌های جاوااسکریپت جاوااسکریپت

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

۴بخش
۲دقیقه خواندن
۴عمق

هفت مقدار، هفت مقدار

هر جفت با عملگر دونویسه‌ای، در یک شبکه

دو سطر را با هم بخوانید: شبکه متقارن است و تعدی‌پذیر نیست، و همین است که آن را به‌عنوان قاعده غیرقابل استفاده می‌کند.

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

0"""0"[]nullundefinedfalse
0۱۱۱۱۰۰۱
""۱۱۰۱۰۰۱
"0"۱۰۱۰۰۰۱
[]۱۱۰۱۰۰۱
null۰۰۰۰۱۱۰
undefined۰۰۰۰۱۱۰
false۱۱۱۱۰۰۱

دو سطر null و undefined تنها سطرهایی هستند که رفتار درستی دارند: با هم برابرند و با هیچ چیز دیگری نه، و همین است که مقایسه با null را تنها استفاده قابل دفاع این عملگر می‌کند.

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

  • 0 == "" نتیجه true
  • 0 == "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 شد. هر دو نصب می‌خواهند، اما پس از نصب برای همین آزمون‌ها به شبکه نیازی ندارند.

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

کنار این

بالای این