عملگرهای برابری ECMAScript

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

ECMAScript دو مجموعه از عملگرهای برابری ارائه می‌دهد: برابر با و غیر برابر با برای پردازش مقادیر اصلی، و برابر با کامل و غیر برابر با کامل برای پردازش اشیاء.

برابر با و غیر برابر با

در ECMAScript، برابر با دو علامت برابر (==) نشان داده می‌شود، که فقط زمانی برابر با true بازمی‌گردد که دو عملگر برابر باشند. غیر برابر با علامت تعجب و علامت برابر (!=) نشان داده می‌شود، که فقط زمانی برابر با true بازمی‌گردد که دو عملگر برابر نیستند. برای تعیین اینکه دو عملگر برابر هستند یا خیر، هر دو عملگر تحت تبدیل نوع قرار می‌گیرند.

قوانین تبدیل نوع به صورت زیر است:

  • اگر یکی از عملگرها Boolean باشد، قبل از بررسی برابری، باید آن را به مقدار عددی تبدیل کرد. false به 0 تبدیل می‌شود، و true به 1.
  • اگر یکی از عملگرها رشته باشد و دیگری عدد، قبل از بررسی برابری، باید تلاش کرد رشته را به عدد تبدیل کرد.
  • اگر یکی از عملگرها شیء باشد و دیگری رشته، قبل از بررسی برابری، باید تلاش کرد شیء را به رشته تبدیل کرد.
  • اگر یکی از عملگرها شیء باشد و دیگری عدد، قبل از بررسی برابری، باید تلاش کرد شیء را به عدد تبدیل کرد.

در مقایسه، این عملگر همچنین از قوانین زیر پیروی می‌کند:

  • مقدار null و undefined برابر با یکدیگر هستند.
  • در بررسی برابری، نمی‌توان null و undefined را به ارزش‌های دیگر تبدیل کرد.
  • اگر یکی از عملگرها NaN باشد، برابر با false بازمی‌گردد، و غیر برابر با true.
  • اگر دو عملگر هر دو شیء باشند، مقایسه‌ای که انجام می‌شود، مقایسه ارزش‌های ارجاعی آنهاست. اگر دو عملگر به یک شیء مشترک اشاره کنند، برابر با true بازمی‌گردد، در غیر این صورت دو عملگر برابر نیستند.

توجه مهم:حتی اگر دو عدد هر دو NaN باشند، برابر با false بازمی‌گردد، زیرا بر اساس قوانین، NaN برابر با NaN نیست.

در جدول زیر برخی از موارد خاص و نتایج آنها لیست شده است:

عبارت مقدار
null == undefined true
"NaN" == NaN false
5 == NaN false
NaN == NaN false
NaN != NaN true
false == 0 true
true == 1 true
true == 2 false
undefined == 0 false
null == 0 false
"5" == 5 true

برابر کامل و غیرمساوی کامل

برابر و غیرمساوی با برابر کامل و غیرمساوی کامل مشابه هستند. این دو عملگر با برابر و غیرمساوی مشابه عمل می‌کنند، اما قبل از بررسی برابری، هیچ تغییر نوع تبدیلی انجام نمی‌شود.

برابر کامل با استفاده از سه برابر (===) نشان داده می‌شود، تنها در صورتی که اعداد بدون تغییر نوع تبدیل با هم برابر باشند، true برمی‌گرداند.

مثال:

var sNum = "66";
var iNum = 66;
alert(sNum == iNum);	// خروجی "true"
alert(sNum === iNum);	// خروجی "false"

در این کد، alert اول با استفاده از برابر (==) رشته "66" و عدد 66 را مقایسه می‌کند و "true" خروجی می‌دهد. همانطور که قبلاً ذکر شد، این به دلیل اینکه رشته "66" به عدد 66 تبدیل می‌شود، سپس با عدد دیگر 66 مقایسه می‌شود. alert دوم با استفاده از برابر کامل (===) رشته و عدد را بدون تغییر نوع تبدیل مقایسه می‌کند، البته، رشته با عدد برابر نیست، بنابراین خروجی "false" است.

عملگر غیرمساوی با استفاده از علامت تعجب و دو برابر (!==) نشان داده می‌شود، تنها در صورتی که اعداد بدون تغییر نوع تبدیل با هم برابر نباشند، true برمی‌گرداند.

مثال:

var sNum = "66";
var iNum = 66;
alert(sNum != iNum);	// خروجی "false"
alert(sNum !== iNum);	// خروجی "true"

در اینجا، alert اول با استفاده از عملگر غیرمساوی، رشته "66" را به عدد 66 تبدیل می‌کند تا با عدد دوم 66 برابر شود. بنابراین، نتیجه محاسبه "false" است، زیرا دو عدد برابر هستند. alert دوم از عملگر غیرمساوی استفاده می‌کند. این عملگر این سوال را می‌پرسد: "sNum" با "iNum" متفاوت است؟" پاسخ به این سوال بله (true) است، زیرا sNum یک رشته است و iNum یک عدد است، بنابراین آنها قطعاً متفاوت هستند.