عملگرهای مقایسه (Comparison Operators)
آخرین دستهی عملگرها که در این فصل به معرفی آنها میپردازیم، عملگرهای مقایسهای (Comparison Operators) هستند. این عملگرها برای مقایسهی دادهها به کار برده میشوند و خروجی آنها همیشه یک مقدار Boolean یعنی true یا false است.
عملگر تساوی "==" (Equality یا Soft Equality)
با استفاده از این عملگر میتوان مقدار دو داده را با هم مقایسه کرد. در صورتی که دو داده، دارای مقدار یکسانی باشند مقدار true، و در غیر این صورت مقدار false توسط این عملگر بازگردانده میشود. نمونههایی از کاربرد این عملگر را در قطعه کد زیر مشاهده میکنید.
let a = 10, b = 20;
a == b;
← false
a == 10;
← true
b == 20;
← true
a == 20;
← false
a == '10'
← true
همانطور که در آخرین دستور فوق مشاهده میکنید. مقدار عددی 10 با مقدار رشتهای "10" زمانی که توسط این عملگر با هم مقایسه میشوند، خروجی این عملگر true است. در واقع این عملگر قبل از مقایسهی دو مقدار، در صورتی که نوع دادهی آنها یکسان نباشد، آنها را تبدیل به یک نوع میکند (معمولاً نوع Number)، سپس عمل مقایسه را انجام میدهد. همین رفتار سبب بروز برخی نتایج عجیب در حالتهای خاص میشود. به قطعه کد زیر توجه کنید.
" " == 0;
← true
" " == "0";
← false
false == "0";
← true
"1" == true;
← true
"2" == true;
← false
"true" == true;
← false
null == undefined;
← true
ظاهراً برخی از نتایج فوق طبیعی به نظر نمیرسند که دلیل آن، تبدیلات ضمنی است که توسط مفسر جاوا اسکریپت انجام میشود. جهت جلوگیری از تبدیلات ضمنی میتوان به جای عملگر "==" از عملگر "===" استفاده کرد.
عملگر تساوی صریح "===" (Hard Equality یا Strict Equality)
این عملگر نیز مانند عملگر قبلی، مقدار دو عملوند خود را مقایسه کرده و در صورت برابری، مقدار true و در غیر این صورت مقدار false را بازمیگرداند. تفاوت این دو عملگر در این است که عملگر "===" هیچ تبدیل نوعی انجام نمیدهد. یعنی معیار اول برابری این است که دو عملوند از یک نوع داده باشند. در صورتی که دو مقدار مورد مقایسه از یک نوع نباشند نتیجه false خواهد بود. و در صورتی که هر دو عملوند از یک نوع باشند، آنگاه در صورتی که مقدار آنها نیز برابر باشد، مقدار true بازگردانده خواهد شد.
" " === 0;
← false
" " === "0";
← false
false === "0";
← false
"1" === 1;
← false
"1" === "1";
← true
null === undefined;
← false
در جاوا اسکریپت در اکثر موارد استفاده از عملگر "===" برای جلوگیری از تبدیلات ضمنی به عملگر "==" ترجیح داده میشود. همچنین یکی از نکات مهم در زمان استفاده از دو عملگر فوق، توجه به این است که مقدار ویژهی NaN را نباید با این عملگرها با مقدار دیگری مقایسه کرد. چرا که مقدار ویژهی NaN با هیچ مقداری (حتی خودش) برابر نیست و نتیجه همیشه false خواهد بود. برای بررسی اینکه آیا مقدار یک متغیر برابر با NaN هست یا خیر؟ باید از متد isNaN استفاده کرد که قبلاً با آن آشنا شدهایم. قطعه کد زیر این موضوع را بهتر نشان میدهد.
NaN === NaN;
← false
Number.isNaN(NaN);
← true
Number.isNaN(5);
← false
عملگرهای عدم تساوی "!=" و "!==" (Inequality)
این دو عملگر دقیقاً معکوس دو عملگر قبلی عمل میکنند. یعنی اگر مقدار دو عملوند با هم برابر باشند مقدار false و در غیر این صورت مقدار true را برمیگردانند. تفاوت عملگرهای "!=" و "!==" نیز دقیقاً مانند دو عملگر قبلی است. یعنی اولی در صورت نیاز، نوع عملوندها را به صورت ضمنی تبدیل میکند، اما دومی هیچ تبدیل نوعی انجام نمیدهد. قطعه کد زیر نمونههایی از کاربرد این عملگرها را نشان میدهد.
16 != '16';
← false
16 !== '16';
← true
عملگرهای مقایسه
برای اینکه مشخص کنید که مقدار یک داده از مقداری دیگر بزرگتر یا کوچکتر است میتوانید از این نوع عملگرها استفاده کنید. در صورتی که این عملگرها را بر روی دادههای عددی به کار ببرید، معنی و مفهوم آنها کاملاً معادل مفهومشان در ریاضیات است. نمونههایی از عملکرد این نوع عملگرها را بر روی دادههای عددی در قطعه کد زیر مشاهده میکنید.
8 > 4;
← true
8 < 4;
← false
8 >= 4;
← true
8 >= 8;
← true
-1 <= 1;
← true
-1 <= -1;
← true
8 <= '8';
← true
توجه کنید که این عملگرها نیز دقیقاً مانند عملگر "=="، در صورت یکسان نبودن نوع عملوندها، یک تبدیل ضمنی انجام میدهند. لذا در دستور آخر قطعه کد فوق، رشتهی "8" ابتدا به عدد 8 تبدیل شده، سپس مقایسه انجام میشود.
همچنین میتوان از این عملگرها برای مقایسهی رشتهها استفاده کرد. در این صورت رشتهها از نظر ترتیب الفبایی با هم مقایسه میشوند. و رشتهای که از نظر الفبایی زودتر از دیگری ظاهر شود. یعنی در لیست مرتب شده زودتر ظاهر شود، مقدار کوچکتری خواهد داشت. به نمونههای زیر توجه کنید.
'apples' < 'bananas';
← true
'apples' < 'Bananas';
← false
دقت کنید که مقایسهی رشتهها حساس به حالت (Case Sensitive) است. در نتیجه بین حروف بزرگ و کوچک تفاوت وجود دارد. همچنین تمام حروف بزرگ لاتین از تمام حروف کوچک لاتین از نظر کد اسکی (ASCII Code) کوچکتر هستند. به همین دلیل در قطعه کد فوق میبینید که در دستور دوم رشتهی "apples" از رشتهی "Bananas" بزرگتر است. زیرا کد اسکی حرف "a" از کد اسکی حرف "B" بزرگتر است. اما در دستور اول چون هر دو رشته با حروف کوچک شروع شدهاند. با توجه به بزرگتر بودن کد اسکی حرف "b" از کد اسکی حرف "a"، رشتهی "apples" از رشتهی "bananas" کوچکتر ارزیابی میشود. همچنین اگر کاراکتر اول هر دو رشته یکسان باشند، کاراکترهای دوم مقایسه میشوند و اگر کاراکتر دوم هم یکسان بود کاراکترهای سوم مقایسه میشوند و ... .