کار با عملگرهای محاسباتی، مقایسهای و منطقی
اهداف یادگیری
- آشنایی با عملگرهای محاسباتی و اولویت اجرای آنها
- یادآوری و تثبیت عملگرهای مقایسهای در کنار عملگرهای منطقی
- درک عملکرد عملگرهای منطقی && ، || و !
- فهم مفهوم Short-Circuit Evaluation در عملگرهای منطقی
مقدمه
تا اینجا با انواع داده و نحوهی مقایسهی آنها آشنا شدیم. حالا وقت آن رسیده که با عملگرهایی آشنا شویم که این مقادیر را در کنار هم بهکار میگیرند: عملگرهای محاسباتی، مقایسهای و منطقی. این عملگرها ستون فقرات تقریباً هر شرط و محاسبهای در جاوااسکریپت هستند.
عملگرهای محاسباتی (Arithmetic Operators)
let a = 10;
let b = 3;
console.log(a + b); // 13
console.log(a - b); // 7
console.log(a * b); // 30
console.log(a / b); // 3.333...
console.log(a % b); // 1 — باقیمانده تقسیم
console.log(a ** b); // 1000 — توان (a به توان b)
عملگر % (باقیمانده یا Modulo) یکی از پرکاربردترین عملگرها در سناریوهایی مثل بررسی زوج یا فرد بودن یک عدد است:
console.log(7 % 2); // 1 — عدد فرد است
console.log(8 % 2); // 0 — عدد زوج است
عملگرهای افزایشی و کاهشی
let count = 5;
count++; // معادل count = count + 1
console.log(count); // 6
count--; // معادل count = count - 1
console.log(count); // 5
نکتهی مهم: ++count (پیشوندی) و count++ (پسوندی) هر دو در نهایت مقدار متغیر را یک واحد افزایش میدهند، اما تفاوت آنها زمانی مشخص میشود که مقدار بازگشتی این عبارت مستقیماً استفاده شود:
let x = 5;
console.log(x++); // 5 — ابتدا مقدار فعلی برگردانده میشود، سپس افزایش مییابد
console.log(x); // 6
let y = 5;
console.log(++y); // 6 — ابتدا افزایش مییابد، سپس مقدار جدید برگردانده میشود
عملگرهای مقایسهای (Comparison Operators)
عملگرهای مقایسهای همیشه یک مقدار Boolean برمیگردانند:
console.log(10 > 5); // true
console.log(10 < 5); // false
console.log(10 >= 10); // true
console.log(10 <= 9); // false
console.log(10 === 10); // true
console.log(10 !== "10"); // true — چون نوع متفاوت است
همانطور که در درسهای قبل دیدیم، همیشه ترجیح این است که بهجای == و !=، از === و !== استفاده کنید تا از تبدیل ضمنی نوع جلوگیری شود.
عملگرهای منطقی (Logical Operators)
سه عملگر منطقی اصلی در جاوااسکریپت عبارتاند از && (و)، || (یا) و ! (نقیض):
console.log(true && false); // false
console.log(true || false); // true
console.log(!true); // false
اما در جاوااسکریپت، این عملگرها فقط با Boolean کار نمیکنند؛ آنها میتوانند روی هر نوع مقداری اعمال شوند و رفتار جالبی دارند که در ادامه بررسی میکنیم.
Short-Circuit Evaluation
عملگرهای && و || بهجای برگرداندن صرفاً true یا false، همیشه یکی از دو عملوند اصلی خود را برمیگردانند:
console.log("علی" && "رضا"); // "رضا" — چون طرف اول Truthy است، طرف دوم برگردانده میشود
console.log("" && "رضا"); // "" — چون طرف اول Falsy است، همانجا متوقف میشود
console.log("علی" || "رضا"); // "علی" — چون طرف اول Truthy است، همانجا متوقف میشود
console.log("" || "رضا"); // "رضا" — چون طرف اول Falsy است، طرف دوم بررسی میشود
تحلیل کد
منطق پشت این رفتار این است: عملگر && فقط زمانی به سراغ عملوند دوم میرود که عملوند اول Truthy باشد؛ اگر عملوند اول Falsy باشد، دیگر نیازی به بررسی ادامه نیست و همان مقدار Falsy برگردانده میشود. برعکس، عملگر || بهمحض رسیدن به یک مقدار Truthy، بلافاصله همان را برمیگرداند و دیگر عملوند دوم را ارزیابی نمیکند. به همین دلیل به این رفتار Short-Circuit (اتصال کوتاه) میگویند: جاوااسکریپت فقط تا جایی که لازم است پیش میرود.
این ویژگی در عمل کاربرد زیادی دارد؛ برای مثال برای تعیین یک مقدار پیشفرض:
let userName = "";
let displayName = userName || "کاربر مهمان";
console.log(displayName); // "کاربر مهمان"
اشتباهات رایج
- تصور اینکه
&&و||همیشهtrueیاfalseبرمیگردانند؛ درحالیکه مقدار واقعی یکی از عملوندها را برمیگردانند. - فراموش کردن تفاوت پیشوندی و پسوندی
++و--در عباراتی که مقدار بازگشتی مستقیماً استفاده میشود. - استفاده از
==و!=بهجای معادلهای Strict آنها.
Best Practices
- برای مقداردهی پیشفرض ساده، از الگوی
value || defaultValueاستفاده کنید؛ اما اگر مقدار0یا""باید معتبر در نظر گرفته شود، از عملگر??که در فصلهای بعد معرفی میشود استفاده کنید. - همیشه از
===و!==برای مقایسه استفاده کنید.
ارتباط با سایر مفاهیم
رفتار Short-Circuit عملگرهای منطقی، مستقیماً به مبحث Truthy/Falsy که در درسهای قبل آموختیم مرتبط است. این عملگرها در فصل بعدی، هنگام نوشتن ساختارهای شرطی مثل if و switch، بهطور مکرر استفاده خواهند شد.
جمعبندی
عملگرهای محاسباتی برای انجام عملیات ریاضی، عملگرهای مقایسهای برای تولید مقادیر Boolean و عملگرهای منطقی برای ترکیب شرطها به کار میروند. نکتهی مهم این است که && و || برخلاف تصور رایج، همیشه true/false برنمیگردانند، بلکه یکی از عملوندهای خود را بر اساس رفتار Short-Circuit بازمیگردانند.
