مقایسه ها

ما بسیاری از عملگر های مقایسه ای ریاضیات زو میشناسیم.

  • بزرگتر/کوچکتر از : a > ba < b
  • بزرگتر/کوچکتر مساوی از:a >= ba <= b
  • مساوی: a == b
  • مساوی نیست: a != b

نتیجه مقدار boolean هست

مانند همه عملگر های دیگر  مقایسه یک مقداری رو برمیگردونه در این مورد مقدار یه نوع boolean هست.

true : به معنی درست یا صحیح

false : به معنی خیر یا اشتباه است.

مثلا :

یک مقایسه رو میتونیم مثل هر مقدار دیگه ای در یک متغیر بریزیم:

 

مقایسه رشته

برای دیدن اینکه یک رشته از دیگری بزرگتر هست جاوا اسکریپت از یک دیکشنری واژگان استفاده میکند.

به عبارتی دیگر رشته ها به صورت حرف به حرف با یکدیگر مقایسه میشوند.

به طور مثال :

الگوریتم مقایسه دو رشته :

  1. مقایسه اولین کاراکتر در هر دو رشته
  2. اگر اولین کاراکتر رشته اول بزرگتر/کوچکتر از رشته دیگر بود رشته اول بزرگتر/کوچکتر است در غیر اینصورت دومی بزرگتر/کوچکتر است.
  3. در غیر اینصورت اگر اولین کاراکتر در دو رشته یکسان بودند کاراکتر دوم مقایسه میشود.
  4. این تکرار تا پایان هر یکی از رشته ها انجام مشود.
  5. در پایان اگر هر دو رشته طول یکسانی داشتند و هنوز بزرگتر/کوچکتر مشخص نشده بود مساوی هستند. در غیر اینصورت رشته طولانی بزرگتر است.

در مثال های بالا ، مقایسه Z و A در اولین مرحله مشخص میشوددر حالی که GLow و Glee کاراکتر به کاراکتر مقایسه میشوند:

  1. G با G مساوی هست.
  2. l با l مساوی هست.
  3. o از e بزرگتر هست. رشته اول بزرگتر هست و مقایسه متوقف میشود.

یک dictionary واقعی نیست یک یونیکد مرتب هست.

به عنوان مثال ، موارد مهم: حروف بزرگ A با حروف کوچک a یکسان نیست.

کدام یکی بزرگتر هستند؟ بله درسته حرفو کوچک بزرگتر هستند.

چرا ؟ چونکه کاراکتر حروف کوچک ایندکس بزرگتری در داخل جدول کد شده جاوااسکریپت استفاده شده دارد.

ما بعدا برمیگردیم و در مورد جزئیات خاص در قسمت رشته ها صحبت میکنیم.


مقایسه نوع های مختلف

وقتی که مقایسه بین دو نوع دیتای متفاوت انجام میشود.جاوااسکریپت مقادیر رو به اعداد تبدیل میکند.

برای مثال :

برای مقادیر boolean مقدار true به ما عدد یک را و برای مقادیر false عدد ۰ را برمیگرداند.

مثلا :


عواقب خنده دار

این امکان در بعضی مواقع وجود دارد:

  • دو مقدار یکسان باشند.
  • یکی از اونها با تبدیل به boolean مقدارش true هست و دیگری false .

ببینیم :

از نگاه جاوا اسکریپت این نتیجه کاملا عادی هست.


یکسانی سخت (Strict equality)

عبارت بررسی مساوی بودن == تفاوتی بین ۰ و false را تشخیص نمیده و در بعضی مواقع این یک به حساب میاد :

و همچنین برای یک رشته خالی هم همین تصمیم رو میگیره:

زیرا این عملگر مساوی بودن == نوع دیتا ها رو به عدد تبدیل میکند.

و در تبدیل رشته خالی و false به اعداد هر دو به ما عدد صفر رو میده در نتیجه مشاوی هستن.

 

اگه بخواهیم ۰ را از false جدا کنیم باید چیکار کنم؟

با عملگر مساوی  سختگیرانه === که برابری را بدون تبدیل نوع بررسی می کند.

در صورتی که عملوند ها نوع یکسانی نداشته باشند بلافاصله بدون تلاش برای تبدیل مقدار false را برمیگرداند

بیایید امتحان کنیم:

همچنین غیر برابری سخت !== هم شبیه به != وجود داره که میتونیم ازش استفاده کنیم.

در این حالت نوشته طولانی تر هست اما چیزیه که اتفاق میافته رو اشکار میکنه و فضای خطا رو کمتر میکنه.

 

مقایسه با null و undefined

رفتار غیر بصری هنگام مقایسه null و undefined با مقادیر دیگر وجود دارد.

برای حالت یکسانی سخت===

مقادیر متفاوت هستن و هر یک از اونها یک نوع متفاوتی هست.

برای بررسی غیر دقیق (non-strict)

یه قانون خاصی وجود داره .

این دو “یک زن و شوهر شیرین”(sweet couple) هستند.
با همدیگه برابرند، اما نه با هر value دیگری.

برای ریاضیات و مقایسه های دیگر

null/undefined به اعداد تبدیل میشوند. null میشه ۰ و undefined میشه NaN.

حالا بذارید چیزای مسخره ای که وقتی این قوانین را اعمال می کنیم اتفاق میافته رو ببینیم.

و مهمتر از همه ، چگونه با آنها به دام نیفتیم.

نتیجه عجیب

ببیایید null رو با صفر مقایسه کنیم.

از نظر ریاضی این عجیب است.

در نتیجه آخر گه null بزرگتر و مساوی هست با صفر بنابراین در یکی از مقایسه های بالا باید true باشه اما هر دو نتیجه false هست.

به این دلیله که مقایسه برابر == و مقایسه های > < >= <= متفاوت عمل میکند.

مقایسه ها null رو به عدد تبدیل میکنند. باهاش مثل ۰ رفتار میکنند.

به همین دلیله که null>= 0 ،میشه true و null> 0  میشه false .
از سوی دیگر مقایسه null و undefined به گونه ای تعریف شده که بدون هیچ گونه تبدیل ، آنها با یکدیگر مساوی می شوند و با هیچ چیز دیگری برابر نیستند.به همین دلیل null == 0 میشه false .

یک undefined غیر قابل مقایسه

مقدار undefined نباید با هیچ value دیگری مقایسه شود.

چرا صفر رو دوست ندارند ؟ همیشه false هست!

به دلایل زیر این نتیجه ها رو بهمون میده :

در مقایسه اول و دوم مقدار false رو بر میگردونه ، زیرا value ها به number تبدیل میشوند و نتیجه تبدیل undefined  به numeric میشه NaN  و این یک مقدار خاصی هست که با مقادیر دیگر فرق داره.

در مقایسه سوم چون ما قبلا گفتیم که undefined فقط با null برابر هست و نه با هیچ مقدار دیگری پس نتیجه false رو برمیگردونه.

از مشکلات دوری کنید

چرا ما این مثال ها رو مرور کردیم؟

بای همه این خاصیت ها رو به یاد داشته باشیم؟

خوب در حقیقت نه ، این ترفند ها به تدریج در گذر زمان مشهور میشن ،اما یک راه خوب برای جلوگیری از مشکلات با آنها وجود دارد:

فقط هر مقایسه ای با undefined/null به جز برابری دقیق === با مراقبت استثنایی رفتار کنید.

مقایسه های >= > < <= را به متغیر هایی که ممکن هست null/undefined باشد استفاده نکنید.

مگر اینکه واقعا مطمئن باشید که چیکار میکنید.

اگر یک متغیر می تواند این مقادیر را داشته باشد ، آنها را جداگانه بررسی کنید.


خلاصه

  • اپراتورهای مقایسه یک مقدار boolean را برمی گردانند.
  • رشته ها به صورت حرف به حرف در دستور “فرهنگ لغت”(dictionary) مقایسه می شوند.
  • وقتی مقادیر مورد مقایسه همنوع نیستند ، آنها به اعداد تبدیل می شوند.
  • مقادیر null و undefined با هم برابر هستند و با هیچ مقدار دیگری یکسان نیستند.
  • در استفاده از مقایسه هایی مانند> یا <با متغیرهایی که گاها ممکن است null/ undefined باشد ، مراقب باشید. بررسی null/ undefined به طور جداگانه ایده خوبی است.

 

منبع :javascript.info

 

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *