کار با عملگرهای محاسباتی، مقایسه‌ای و منطقی

اهداف یادگیری

  • آشنایی با عملگرهای محاسباتی و اولویت اجرای آن‌ها
  • یادآوری و تثبیت عملگرهای مقایسه‌ای در کنار عملگرهای منطقی
  • درک عملکرد عملگرهای منطقی && ، || و !
  • فهم مفهوم 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 بازمی‌گردانند.