javascriptStrict equalityبرابری سختگیرانه در جاوااسکریپت
عملگر === در جاوااسکریپت برابری را بدون تبدیل نوع بررسی میکند؛ تفاوت آن با == و مقایسهٔ شیءها را با مثال شناسهٔ محصول یاد بگیرید.
مفهوم به زبان ساده
وقتی میپرسید آیا دو شناسه برابرند، نوع داده هم بخشی از پاسخ است. عملگر === اگر نوع دو طرف متفاوت باشد false میدهد و آنها را برای برابرکردن، خودکار به یک نوع تبدیل نمیکند. پس عدد 7 و متن '7' با === برابر نیستند. در مقابل، == ممکن است پیش از مقایسه تبدیل نوع انجام دهد؛ برای شروع، === انتخابی روشنتر برای قراردادی است که نوع داده در آن مشخص است.
این رفتار به معنی مقایسهٔ عمیق محتویات نیست. دو #object جدا، حتی با ویژگیهای همنام و هممقدار، با === برابر نمیشوند. برابر بودن مرجع یعنی هر دو طرف به همان شیء اشاره کنند. همین موضوع دربارهٔ #array هم صدق میکند؛ برای مقایسهٔ محتوای آرایه باید معیار جداگانهای داشته باشید.
در مثال، شناسهٔ مدل عددی است ولی مقدار دریافتی از فرم متن است. ابتدا نوع هر مرز را مشخص میکنیم، نه اینکه همهٔ مقایسهها را به == تغییر دهیم. Number در این نمونهٔ کنترلشده متن رقمدار را تبدیل میکند؛ در ورودی واقعی، خالی نبودن و معتبر بودن آن هم باید بررسی شود. برای نابرابریِ متناظر با این قرارداد، !== را به کار ببرید. دو نکتهٔ عددی را نیز به خاطر بسپارید: NaN حتی با خودش === نیست و صفر مثبت و منفی با این عملگر برابرند.
کجا به کار میآید؟
- مقایسهٔ شناسهها پس از تعیین قرارداد نوع داده
- بررسی وضعیتهایی مانند status === 'ready' بدون تبدیل خاموش
از تعریف تا یک مثال واقعی
const productId = 7;
const formId = '7';
console.log(productId === formId);
console.log(productId === Number(formId));
const first = { id: 7 };
const same = first;
console.log(first === same);
console.log(first === { id: 7 });
console.log(NaN === NaN);
false true true false false
این مثال چطور کار میکند؟
عدد ۷ و رشتهٔ '7' نوع متفاوت دارند و در مقایسهٔ نخست برابر نیستند.
پس از تبدیل کنترلشدهٔ formId به عدد، دو عدد ۷ برابرند.
same به همان شیء first اشاره دارد و مقایسهٔ آنها true است.
شیء تازه با id مشابه، مرجع دیگری دارد؛ NaN نیز با خودش برابر نیست.
اشتباه رایج
تغییر === به == برای پنهانکردن ناهماهنگی نوع، قرارداد داده را مبهم میکند. نوع ورودی را در مرز دریافت مشخص و معتبر کنید. برای تشخیص NaN از Number.isNaN استفاده کنید.
این را به خاطر بسپارید
=== تبدیل نوع نمیکند و برای شیءها هویت مرجع را میسنجد؛ برابری محتوا قرارداد جدا میخواهد.