تفاوت عملگرها
برای عملیات x === y یا Strict Equality Comparison جاوااسکریپت از الگوریتم زیر استفاده میکند: (الگوریتم ساده شده)
- اگر نوع داده ها یکسان نباشد -> false
- اگر نوع داده ها primitiveباشد برابر بودن مقادیر آنها مقایسه می شود
- اگر نوع داده ها non-primitiveباشد برابر بودن در صورتی برابر هستند که به یک شی اشاره کنند.
ولی عملگر == یا Abstract Equality Comparison عملگر پیچیده تری است و برای مقایسه جاوااسکریپت از type coercion استفاده میکند.
یعنی برای محاسبه بر روی دو نوع داده مختلف با تبدیل کردن نوع داده سعی بر ایجاد تساوی دارد.
که این باعث به وجود آمدن باور غلط "این عملایت بدون در نظر گرفتن نوع داده فقط مقادیر را فقط بررسی میکند." شده است.
برای محاسبه x == y جاوااسکریپت از الگوریتم زیر استفاده می شود: (الگوریتم ساده شده) 
- اگر نوع داده ها یکسان باشد:
- اگر numberباشند:
- اگر یکی از عملوندها NaNباشد ->false
- اگر مقدار یکسان داشته باشند -> true
- اگر یکی -0و دیگری+0باشد ->true
- در غیر این صورت -> false
 
- اگر stringباشند:
- اگر همه ی کارکترها یکسان باشند -> true
- در غیر این صورت -> false
 
- اگر booleanباشند
- اگر یکسان باشند -> true
- در غیر این صورت -> false
 
 
- اگر یکی undefinedو دیگریnullباشد ->true
- اگر یکی numberباشد و دیگریstringباشد انگاه رشته را به عدد تبدیل کن و عملیات را تکرار کن
- اگر نوع یکی از داده ها booleanباشد آنگاه آن را به عدد تبدیل کن و عملیات را تکرار کن
- اگر نوع یکی از داده ها stringیاnumberباشد و دیگریobjectباشد انگاهobjectرا بهprimitiveتبدیل کن و عملیات را تکرار کن
- در غیر این صورت -> false
چرا استفاده از عملگر  == توصیه نمی شود
خوب با توجه به توضیحات بالا میتوانید متوجه شوید که عملیات == خیلی غیر قابل پیشبینی می باشد و هیچنین از قانون تراگذری نیز پیروی نمی کند و این ممکنه باعث به وجود آمدن رفتاری غیر قابل پیشبینی در کد شما شود برای مثال:
// عدم وجود رابطه تراگذری
0 == "0" // => true
0 ==  "" // => true
0 == "0" // => false
از دیگر مشکلات این عملگر میتوان به عدم صراحت و سخت کردن دیباگ برنامه اشاره کرد برای مثال:
function whatIsNum(a) {
  if (this.num == 0){ 
    return "?";
  }
}
در مثال بالا متغیر this.num پس از گذشتن از شرط میتواند مقادیر (0, "0", [], false و...) را داشته باشد و این ممکن است باعث ایجاد رفتاری شود که شما انتظار ندارید.
برای همین استفاده از این عملگر جز Bad Practice ها در جاوااسکریپت است.
استفاده از این عملگر چه زمانی مناسب است؟
با توجه به مشکلاتی که ذکر شد این عملگر میتواند کاربردی باشد. یکی از کاربرد های این عملگر برای چک کردن null یا undefined بودن یک متغییر می باشد. برای مثال
if(a === undefined || a === null) {
  // a is undefined or null
}
را میتوان به سادگی با استفاده از عملگر == به این صورت نوشت:
if(a == null) {
  // a is undefined or null
}
۲ قطعه کد بالا کاملا یکسان هستند.
برای مطالعه بیشتر منابع زیر را پیشنهاد میکنم: