آموزش مقدماتی جاوااسکریپت: عملگرهای پایه و ریاضی
آموزش مقدماتی جاوااسکریپت: عملگرهای پایه و ریاضی
۱۸۳ بازدید
0 نظر
۰۲ بهمن ۱۴۰۳

احتمالاً با خیلی از عملگرها از دوران مدرسه آشنا هستی، مثل جمع (+)، ضرب (*)، تفریق (-) و این جور چیزها. حالا تو این مقاله قراره علاوه بر آشنایی با عملگرهای ساده، یه سری نکات خاص جاوااسکریپتی رو یاد بگیریم که شاید توی ریاضی مدرسه بهشون اشاره نشده باشه.

مفاهیم اولیه: "عملوند"، "یوناری"، "باینری" چی هستن؟

قبل از اینکه بریم سراغ عملگرها، یه سری اصطلاح ساده ولی مهم رو باید بدونی:

  • عملوند (Operand): عملوند اون چیزی هست که عملگر روی اون اعمال می شه. مثلاً توی عبارت 5 * 2، دوتا عملوند داریم: یکی عدد ۵ و یکی عدد ۲. گاهی به این عملوندها "آرگومان" هم می گن.
  • عملگر یوناری (Unary Operator): وقتی یه عملگر فقط یه دونه عملوند داشته باشه، بهش می گیم "یوناری". مثلاً عملگر منفی (-) که علامت عدد رو برعکس می کنه.

    let x = 1;
    x = -x; // حالا x منفی شده
    alert(x); // خروجی: -1
  • عملگر باینری (Binary Operator): عملگرهایی که با دوتا عملوند کار می کنن، بهشون می گیم "باینری". مثلاً همین علامت منفی (-) وقتی برای تفریق استفاده می شه، باینریه.
let x = 1, y = 3;
alert(y - x); // خروجی: 2

تفاوت فرم های یوناری و باینری

نکته جالب اینه که بعضی از عملگرها مثل علامت منفی (-) می تونن هم یوناری باشن و هم باینری. بسته به این که با یک عملوند کار کنن یا دوتا، رفتار متفاوتی دارن:

  • یوناری: علامت عدد رو برعکس می کنه (مثبت رو منفی و منفی رو مثبت).
  • باینری: مقدار عملوند دوم رو از عملوند اول کم می کنه.
let a = 5;
let b = -a; // یوناری: علامت a رو برعکس می کنه
alert(b); // خروجی: -5

let c = 10, d = 4;
alert(c - d); // باینری: مقدار d رو از c کم می کنه
// خروجی: 6

پس یاد گرفتیم که عملگرها بسته به تعداد عملوندی که باهاشون کار می کنن، می تونن "یوناری" یا "باینری" باشن. این مفهوم تو جاوااسکریپت خیلی مهمه و تو ادامه، بیشتر باهاش کار می کنیم. آماده ای که بریم سراغ نکات دیگه؟

عملیات ریاضی در جاوااسکریپت

جاوااسکریپت از چند عملیات ریاضی ساده و پرکاربرد پشتیبانی می کنه که احتمالاً با بیشترشون آشنا هستی:

  • جمع (+)
  • تفریق (-)
  • ضرب (*)
  • تقسیم (/)
  • باقیمانده (%)
  • توان (**)

چهار عمل اول که دیگه کاملاً مشخصه و نیاز به توضیح خاصی ندارن. اما بیایید یه کم درباره دو تا از این عملیات، یعنی باقیمانده و توان، بیشتر صحبت کنیم.

عملگر باقیمانده (%)

عملگر باقیمانده (%) برعکس چیزی که از اسمش ممکنه به نظر برسه، هیچ ربطی به درصد نداره! در واقع، نتیجه این عملگر باقی مونده تقسیم عدد اول بر عدد دومه.

مثال ها:

5 تقسیم بر 2: وقتی ۵ رو بر ۲ تقسیم کنیم، حاصل تقسیم ۲ هست، اما یه باقی مونده می مونه که برابر با ۱ هست.

alert(5 % 2); // خروجی: 1

8 تقسیم بر 3: حاصل تقسیم ۲ هست و باقی مونده ۲ می مونه.

alert(8 % 3); // خروجی: 2

8 تقسیم بر 4: اینجا چون ۸ کاملاً بر ۴ بخش پذیره، باقی مونده ۰ می شه.

alert(8 % 4); // خروجی: 0

عملگر توان (**)

عملگر توان (**) عدد اول رو به توان عدد دوم می رسونه. همون چیزی که توی ریاضی بهش می گیم "توان" یا "به توان رسوندن".

مثال ها:

2 به توان 2: یعنی 2 * 2 که می شه ۴.

alert(2 ** 2); // خروجی: 4

2 به توان 3: یعنی 2 * 2 * 2 که می شه ۸.

alert(2 ** 3); // خروجی: 8

2 به توان 4: یعنی 2 * 2 * 2 * 2 که می شه ۱۶.

alert(2 ** 4); // خروجی: 16

کار با توان های اعشاری

جاوااسکریپت فقط با توان های عدد صحیح کار نمی کنه. می تونی توان های اعشاری هم استفاده کنی، مثل ریشه گرفتن از اعداد.

مثال ها:

ریشه دوم عدد 4: یعنی به توان 1/2 برسونیم:

alert(4 ** (1 / 2)); // خروجی: 2

ریشه سوم عدد 8: یعنی به توان 1/3 برسونیم:

alert(8 ** (1 / 3)); // خروجی: 2

عملیات ریاضی توی جاوااسکریپت خیلی شبیه همون چیزیه که تو مدرسه یاد گرفتیم. فقط کافیه بدونی چطوری از عملگرها استفاده کنی و جاوااسکریپت بقیه کارها رو خودش انجام می ده.

ترکیب رشته ها با عملگر جمع (+)

جاوااسکریپت همیشه یه چیزای جالبی تو آستینش داره که فراتر از ریاضی مدرسه ایه! یکی از این چیزای جالب، رفتار خاص عملگر جمع + با رشته هاست.

جمع اعداد یا ترکیب رشته ها؟

معمولاً وقتی از عملگر جمع + استفاده می کنیم، انتظار داریم که عددها رو با هم جمع کنه. اما اگه یکی از مقادیر ما یه رشته (string) باشه، به جای جمع کردن، این عملگر رشته ها رو به هم می چسبونه. به این کار می گیم ترکیب رشته ها یا همون Concatenation.

مثال ساده:

let s = "my" + "string";
alert(s); // خروجی: mystring

اینجا دوتا رشته "my" و "string" با هم ترکیب شدن و نتیجش شد "mystring".

وقتی یه طرف ماجرا رشته باشه...

حالا اگه یکی از عملوندها (اون چیزی که عملگر روش کار می کنه) رشته باشه، جاوااسکریپت به طور خودکار اون یکی رو هم به رشته تبدیل می کنه.

مثال:

alert('1' + 2); // خروجی: "12"
alert(2 + '1'); // خروجی: "21"

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

ترتیب عملگرها و تأثیرش

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

مثال:

alert(2 + 2 + '1'); // خروجی: "41"

چرا؟
اول، 2 + 2 یه جمع ریاضی هست، پس می شه ۴. بعد، 4 + '1' یه ترکیب رشته ای می شه، یعنی خروجی می شه "41".

یه مثال دیگه:

alert('1' + 2 + 2); // خروجی: "122"

چرا اینطوری شد؟
اینجا + از چپ شروع می کنه:

  • اول، '1' + 2 یعنی "12".
  • بعد، "12" + 2 یعنی "122".

عملگرهای دیگه و عددها

برخلاف + که با رشته ها رفتار خاصی داره، بقیه عملگرهای ریاضی مثل -، /، * همیشه با عددها کار می کنن و اگه عملوندی رشته باشه، سعی می کنن اون رو به عدد تبدیل کنن.

مثال ها:

alert(6 - '2'); // خروجی: 4 (رشته '2' به عدد تبدیل می شه)
alert('6' / '2'); // خروجی: 3 (هر دو رشته به عدد تبدیل می شن)

نکته آخر: عملگر + تنها عملگریه که از رشته ها به این شکل پشتیبانی می کنه. برای بقیه عملگرها، جاوااسکریپت همیشه تلاش می کنه که همه چیز رو به عدد تبدیل کنه. پس موقع کار با این عملگرها حواست باشه که کد چه جوری رفتار می کنه و نوع داده هات چیه.

تبدیل عددی با عملگر مثبت تک عملوندی (+)

عملگر + توی جاوااسکریپت دو نقش متفاوت داره: یکی دوتایی (Binary) که قبلاً دیدیم (برای جمع عددها یا ترکیب رشته ها)، و یکی هم تک عملوندی (Unary) که قراره اینجا یاد بگیریم.

عملگر مثبت تک عملوندی چیکار می کنه؟

اگه + رو روی یه مقدار بذاریم و فقط یه عملوند داشته باشه (مثل +x)، این عملگر سعی می کنه مقدار رو به عدد تبدیل کنه.

تأثیر روی عددها

اگه مقدار خودش عدد باشه، هیچ تغییری روش انجام نمی ده. یعنی همون مقدار برمی گرده.

let x = 1;
alert( +x ); // خروجی: 1

let y = -2;
alert( +y ); // خروجی: -2

تبدیل غیرعددها به عدد

اما اگه مقدار عدد نباشه (مثلاً رشته، بولین یا هر چیز دیگه)، + اون رو به عدد تبدیل می کنه.

alert( +true ); // خروجی: 1 (true به عدد 1 تبدیل می شه)
alert( +"" );   // خروجی: 0 (رشته خالی به عدد 0 تبدیل می شه)

این کار دقیقاً مثل تابع Number(...) عمل می کنه، ولی نوشتنش کوتاه تر و ساده تره.

چرا این کار مفیده؟

خیلی وقت ها توی پروژه ها، مقادیر عددی از ورودی های فرم ها یا جاهای دیگه به صورت رشته برمی گردن. حالا اگه بخوایم این مقادیر رو با هم جمع کنیم، باید اول به عدد تبدیلشون کنیم.

مشکل با جمع دوتایی

اگه مستقیماً از عملگر جمع دوتایی (+) استفاده کنیم، مقادیر به جای جمع شدن، ترکیب می شن:

let apples = "2";
let oranges = "3";

alert( apples + oranges ); // خروجی: "23" (رشته ها به هم چسبیدن)

راه حل با + تک عملوندی

برای اینکه واقعاً جمع عددی انجام بشه، باید مقادیر رو اول به عدد تبدیل کنیم. اینجاست که + تک عملوندی به کار میاد:

let apples = "2";
let oranges = "3";

// هر دو مقدار به عدد تبدیل می شن و بعد جمع می شن
alert( +apples + +oranges ); // خروجی: 5

روش طولانی تر:

این کار رو می شه با Number(...) هم انجام داد، ولی طولانی تر می شه:

alert( Number(apples) + Number(oranges) ); // خروجی: 5

چرا + تک عملوندی اول اجرا می شه؟

توی جاوااسکریپت، هر عملگر یه اولویت اجرا داره. عملگرهای تک عملوندی (مثل همین +) اول اجرا می شن و بعد نوبت عملگرهای دوتایی مثل جمع می رسه.

مثال:

let apples = "2";
let oranges = "3";

alert( +apples + +oranges ); 
  • اول +apples و +oranges مقدارها رو به عدد تبدیل می کنن.
  • بعد، عملگر جمع دوتایی (+) عددها رو با هم جمع می کنه.

نکته آخر: اگه با داده هایی سر و کار داری که ممکنه رشته باشن ولی قراره به صورت عددی استفاده بشن، + تک عملوندی یه ابزار سریع و تمیز برای تبدیل اون ها به عدد هست. پس برای راحتی کار، ازش استفاده کن و از نتایج شسته رفتش لذت ببر! 

ترتیب اولویت عملگرها تو جاوااسکریپت

تو جاوااسکریپت، وقتی یه عبارت شامل چند تا عملگر باشه، ترتیب اجراشون رو یه چیزی به اسم اولویت عملگرها (Operator Precedence) مشخص می کنه. یعنی جاوااسکریپت تصمیم می گیره که کدوم عملگر اول اجرا بشه.

ترتیب پیش فرض چطوریه؟

یه چیزایی از مدرسه یادت هست، درسته؟ مثلاً توی عبارت 1 + 2 * 2، اول ضرب انجام می شه و بعد جمع. چرا؟ چون ضرب نسبت به جمع اولویت بیشتری داره. همین ایده توی جاوااسکریپت هم هست.

پرانتز، رئیس همه!

اگه بخوای ترتیب پیش فرض رو تغییر بدی، فقط کافیه از پرانتز استفاده کنی. پرانتز همیشه اولویت رو تغییر می ده و کاری که داخلش نوشته شده رو اول اجرا می کنه.

alert( 1 + 2 * 2 ); // خروجی: 5 (اول ضرب، بعد جمع)
alert( (1 + 2) * 2 ); // خروجی: 6 (پرانتز باعث می شه جمع اول انجام بشه)

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

چند نمونه از جدول اولویت عملگرها:

(یادت باشه حفظ کردنشون لازم نیست! فقط برای آشناییه.)

اولویتاسم عملگرعلامت
14مثبت تک عملوندی+
14منفی تک عملوندی-
13توان (Exponentiation)**
12ضرب*
12تقسیم/
11جمع+
11تفریق-
2انتساب (Assignment)=

چرا عملگرهای تک عملوندی اولویت بیشتری دارن؟

ببین، عملگرهایی مثل + و - وقتی به صورت تک عملوندی استفاده می شن، اولویت بالاتری دارن. این یعنی، اگه توی یه عبارت، هم عملگر تک عملوندی باشه هم دوتایی، جاوااسکریپت اول سراغ تک عملوندی می ره.

مثال:

let apples = "2";
let oranges = "3";

alert( +apples + +oranges ); // خروجی: 5

اینجا +apples و +oranges (عملگر تک عملوندی) اول اجرا می شن و رشته ها رو به عدد تبدیل می کنن. بعدش عملگر جمع دوتایی (+) اعداد رو با هم جمع می کنه.

نکته مهم: پرانتز می تونه هرجایی لازم بود اولویت ها رو تغییر بده. پس اگه ترتیب پیش فرض با چیزی که می خوای جور نیست، از پرانتز استفاده کن و کنترل ترتیب رو دست خودت بگیر. به همین راحتی! 😎

alert( 1 + 2 ** 3 ); // خروجی: 9 (توان اول اجرا می شه)
alert( (1 + 2) ** 3 ); // خروجی: 27 (پرانتز باعث می شه جمع اول انجام بشه)

حالا دیگه ترتیب عملگرها دستت اومده! 😊

انتساب در جاوااسکریپت: بیشتر از یک علامت ساده! 

خب، بیاید در مورد یه چیز ساده ولی جالب حرف بزنیم: عملگر انتساب یا همون = که همیشه بهش به چشم یه علامت نگاه می کردیم. این علامت یه چیز معمولی نیست، بلکه خودش یه عملگر محسوب می شه و داستانای جذابی پشتش داره.

اولویت انتساب

عملگر = اولویت خیلی پایینی داره (عدد ۲ تو جدول اولویت ها). این یعنی وقتی توی یه عبارت می نویسی:

let x = 2 * 2 + 1;
alert(x); // خروجی: 5

جاوااسکریپت اول عملیات ضرب (2 * 2) و جمع (+) رو انجام می ده و بعد نتیجه رو به x اختصاص می ده. به همین خاطر، ترتیب انجام کارا رو خود زبان هوشمندانه مدیریت می کنه.

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

نکته بامزه اینه که = فقط مقدار رو داخل متغیر نمی ریزه؛ بلکه خودش یه مقدار رو برمی گردونه. این یعنی x = value مقدار value رو هم برمی گردونه.

مثال:

let a = 1;
let b = 2;

let c = 3 - (a = b + 1);

alert(a); // خروجی: 3
alert(c); // خروجی: 0

اینجا چی شد؟

  • اول عبارت (a = b + 1) اجرا شد. a شد ۳ و همون ۳ رو هم برگردوند.
  • بعد، 3 - 3 محاسبه شد و مقدار c برابر ۰ شد.

نکته مهم: این نوع کدها شاید تو بعضی جاها ببینیم، ولی نوشتنش زیاد توصیه نمی شه چون خوندنش برای دیگران سخت می شه.

زنجیره کردن انتساب ها

یه ویژگی جالب دیگه تو جاوااسکریپت اینه که می تونی چندتا متغیر رو زنجیره ای مقداردهی کنی. مثلاً:

let a, b, c;

a = b = c = 2 + 2;

alert(a); // خروجی: 4
alert(b); // خروجی: 4
alert(c); // خروجی: 4

اینجا چی شد؟

  • جاوااسکریپت اول عبارت سمت راست (2 + 2) رو اجرا کرد و مقدارش رو ۴ گرفت.
  • بعد این مقدار رو از راست به چپ به متغیرها داد: اول به c، بعد به b، و در نهایت به a.

خوندنی تر کردن کد

چنین زنجیره هایی ممکنه خوندن کد رو سخت کنه. برای همین بهتره این جور کدها رو به چند خط تقسیم کنی:

c = 2 + 2;
b = c;
a = c;

این روش خوندن کد رو ساده تر و درک رو سریع تر می کنه.

عملگر = فقط یه علامت ساده نیست، بلکه یه عملگره که:

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

یادت باشه این قابلیت ها رو هوشمندانه استفاده کنی و کدت رو همیشه قابل فهم بنویسی!

تغییر مقادیر درجا با عملگرها (Modify-in-place)

خیلی وقتا لازم می شه یه عملیات ریاضی رو روی یه متغیر انجام بدیم و نتیجه رو دوباره تو همون متغیر ذخیره کنیم.

مثال:

let n = 2;
n = n + 5;
n = n * 2;

حالا به جای اینکه این قدر طولانی بنویسیم، می تونیم از یه روش کوتاه تر با عملگرهای += یا *= استفاده کنیم:

let n = 2;
n += 5; // الان n می شه 7 (همون n = n + 5)
n *= 2; // الان n می شه 14 (همون n = n * 2)

alert(n); // 14

این نوع عملگرهای کوتاه شده برای همه ی عملیات های ریاضی و بیتی وجود دارن، مثل /=, -= و... .

نکته: این عملگرها همون اولویت = رو دارن. یعنی اول قسمت راست محاسبه می شه، بعد نتیجه تو متغیر ذخیره می شه.

مثال:

let n = 2;

n *= 3 + 5; // اول 3 + 5 حساب می شه (8)، بعد n * 8
alert(n); // 16

افزایش/کاهش مقدار متغیر (Increment/Decrement)

یکی از رایج ترین کارا توی ریاضی، زیاد یا کم کردن یه مقدار به اندازه ۱ هست. جاوااسکریپت برای این کار عملگرهای خاصی داره:

Increment ++

این عملگر یه مقدار به متغیر اضافه می کنه:

let counter = 2;
counter++; // مثل counter = counter + 1 ولی کوتاه تر
alert(counter); // 3

Decrement --

این عملگر یه مقدار از متغیر کم می کنه:

let counter = 2;
counter--; // مثل counter = counter - 1 ولی کوتاه تر
alert(counter); // 1

نکته مهم: این عملگرها فقط روی متغیرها کار می کنن. اگه بخوای ازشون روی مقادیر ثابت استفاده کنی (مثل 5++)، بهت خطا می ده.

پیشوندی (++counter) و پسوندی (counter++)

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

  • وقتی بعد از متغیر بیاد (پسوندی)، مثل counter++.
  • وقتی قبل از متغیر بیاد (پیشوندی)، مثل ++counter.

هر دوشون کارشون یکیه: متغیر رو یک واحد زیاد (یا کم) می کنن. اما فرقشون زمانی معلوم می شه که بخوای از مقدار برگشتی این عملگرها استفاده کنی.

فرق پیشوندی و پسوندی

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

  • پیشوندی: مقدار جدید رو برمی گردونه.
  • پسوندی: مقدار قبلی رو برمی گردونه.

مثال:

let counter = 1;
let a = ++counter; // پیشوندی

alert(a); // 2

اینجا چی شد؟

++counter مقدار counter رو زیاد کرد (۲) و مقدار جدید رو برگردوند. پس a شد ۲.

حالا بیایم از حالت پسوندی (counter++) استفاده کنیم:

let counter = 1;
let a = counter++; // (*) اینجا از counter++ استفاده شده
alert(a); // 1

اینجا چی شد؟

counter++ مقدار counter رو زیاد کرد (۲)، ولی مقدار قبلی (۱) رو برگردوند. به همین خاطر alert مقدار ۱ رو نشون می ده.

خلاصه ای از فرق پیشوندی و پسوندی:

اگه نتیجه ی افزایش/کاهش استفاده نشه، هر دو یکسان عمل می کنن:

let counter = 0;
counter++;
++counter;
alert(counter); // 2، هر دو خط کار یکسانی کردن

اگه بخوایم بعد از افزایش مقدار، فوراً از نتیجه استفاده کنیم، از پیشوندی استفاده می کنیم:

let counter = 0;
alert(++counter); // 1

اگه بخوایم مقدار رو افزایش بدیم ولی مقدار قبلی رو استفاده کنیم، از پسوندی استفاده می کنیم:

let counter = 0;
alert(counter++); // 0

عملگرهای ++ و -- رو می تونیم توی عبارت ها هم استفاده کنیم. اولویت این عملگرها بالاتر از بیشتر عملگرهای ریاضی هست.

مثال:

let counter = 1;
alert(2 * ++counter); // 4

++counter اول مقدار counter رو زیاد می کنه (۲)، بعد نتیجه ی جدید رو داخل ضرب استفاده می کنه.

پس 2 * 2 = 4.

حالا مقایسه کنیم با این حالت:

let counter = 1;
alert(2 * counter++); // 2

اینجا counter++ مقدار قبلی (۱) رو برمی گردونه و بعد مقدار counter رو زیاد می کنه.

پس 2 * 1 = 2.

یک نکته مهم: از نظر فنی این نوع استفاده مشکلی نداره، ولی معمولاً کد رو ناخوانا می کنه. چرا؟ چون یه خط داره چندتا کار انجام می ده و ممکنه موقع خوندن کد، به راحتی از چیزی مثل counter++ غافل بشیم.

بهتره کد رو اینجوری بنویسیم که هر خط فقط یه کار انجام بده:

let counter = 1;
alert(2 * counter); // محاسبه و نمایش ضرب
counter++;          // افزایش مقدار

این سبک نوشتن کد رو قابل فهم تر می کنه و خوانایی رو بالا می بره. 😊

Bitwise Operators

عملگرهای بیت به بیت (Bitwise) توی جاوااسکریپت با اعداد به صورت 32 بیتی کار می کنن و عملیاتشون رو روی نمایش باینری (دودویی) اون اعداد انجام می دن.
این عملگرها مخصوص جاوااسکریپت نیستن و توی بیشتر زبان های برنامه نویسی استفاده می شن.

لیست عملگرهای بیت به بیت:

  • AND ( & )
  • OR ( | )
  • XOR ( ^ )
  • NOT ( ~ )
  • LEFT SHIFT ( << )
  • RIGHT SHIFT ( >> )
  • ZERO-FILL RIGHT SHIFT ( >>> )

این عملگرها خیلی کم استفاده می شن، مخصوصاً توی توسعه وب.
اما توی حوزه هایی مثل رمزنگاری (cryptography) و کارهای تخصصی تر، خیلی کاربرد دارن.
اگه زمانی نیاز داشتی، می تونی از مستندات MDN برای یادگیری عمیق تر کمک بگیری.

عملگر کاما (Comma)

عملگر کاما (,) یکی از عجیب ترین و کم استفاده ترین عملگرهاست، ولی گاهی برای کوتاه تر کردن کد به کار می ره.
این عملگر اجازه می ده چندتا عبارت رو با کاما از هم جدا کنیم.
نکته: تمام عبارت ها اجرا می شن، ولی فقط نتیجه ی آخرین عبارت برگردونده می شه.

مثال:

let a = (1 + 2, 3 + 4);

alert(a); // 7 (نتیجه 3 + 4)

اینجا چی شد؟

  • اول 1 + 2 اجرا شد و نتیجه اش نادیده گرفته شد.
  • بعد 3 + 4 اجرا شد و همین مقدار (۷) به عنوان نتیجه نهایی برگردونده شد.

عملگر کاما اولویت خیلی پایینی داره، حتی پایین تر از عملگر =.
به همین خاطر، اگه از پرانتز استفاده نکنیم، نتیجه اشتباه می شه:

let a = 1 + 2, 3 + 4;

این کد این جوری تفسیر می شه:

  • اول 1 + 2 اجرا می شه و نتیجه اش می شه a = 3.
  • بعدش 3 + 4 اجرا می شه، ولی نادیده گرفته می شه.

برای همین استفاده از پرانتز خیلی مهمه.

چرا عملگر کاما وجود داره؟

گاهی برای نوشتن چند عملیات توی یک خط از این عملگر استفاده می کنن.

مثال:

// سه عملیات توی یه خط
for (a = 1, b = 3, c = a * b; a < 10; a++) {
  ...
}

آیا باید از این روش استفاده کنیم؟

خب، راستش این روش می تونه توی فریم ورک های جاوااسکریپت یا کدهای پیچیده دیده بشه.
اما معمولاً خوانایی کد رو کم می کنه. پس بهتره قبل از استفاده، حسابی فکر کنیم! 

تمرینات مربوط به عملگرها

Ready to practice?

تمرین 1: حالت پیشوندی و پسوندی

بعد از اجرای کد زیر، مقدار نهایی متغیرهای a، b، c و d چیه؟

let a = 1, b = 1;

let c = ++a; // ?
let d = b++; // ?

جواب:

  • a = 2
  • b = 2
  • c = 2
  • d = 1
  • خط اول: مقدار a و b هر دو برابر 1 هستن.
  • خط دوم: ++a یعنی حالت پیشوندی. این حالت اول مقدار a رو افزایش می ده و بعد مقدار جدیدش رو برمی گردونه. بنابراین، a برابر 2 می شه و c مقدار 2 رو می گیره.
  • خط سوم: b++ یعنی حالت پسوندی. این حالت اول مقدار قدیمی b رو برمی گردونه و بعد b رو افزایش می ده. بنابراین، d مقدار قدیمی 1 رو می گیره و بعد b برابر 2 می شه.
let a = 1, b = 1;

alert( ++a ); // 2، حالت پیشوندی مقدار جدید رو برمی گردونه
alert( b++ ); // 1، حالت پسوندی مقدار قدیمی رو برمی گردونه

alert( a ); // 2، یک بار افزایش یافته
alert( b ); // 2، یک بار افزایش یافته

تمرین 2: نتیجه انتساب

بعد از اجرای کد زیر، مقدار a و x چیه؟

let a = 2;

let x = 1 + (a *= 2);

جواب:

  • a = 4 (ضرب در 2)
  • x = 5 (محاسبه شده به صورت 1 + 4)
  • خط اول: مقدار اولیه a برابر 2 هست.
  • خط دوم: a *= 2 یعنی a = a * 2. پس مقدار a برابر 4 می شه. بعد عبارت 1 + 4 محاسبه می شه و مقدار نهایی x برابر 5 هست.
let a = 2;

let x = 1 + (a *= 2); // a ضربدر 2 می شه، یعنی 4. بعد 1 + 4 محاسبه می شه.

alert(a); // 4
alert(x); // 5

جمع بندی

این مقاله یه خلاصه از عملگرهای جاوااسکریپت بود که بهمون کمک می کنه اگه خواستیم محاسبات ریاضی انجام بدیم، درست و سریع پیش بریم. تو این مقاله به چندتا نکته مهم اشاره شد:

اول از همه، عملگرها رو معرفی کردیم که شامل عملگرهای یوناری (مثل منفی که فقط یه عملوند می خواد) و باینری (مثل جمع یا تفریق که دو عملوند می خوان) می شه. بعدش فهمیدیم که بعضی عملگرها مثل علامت منفی می تونن هم یوناری باشن هم باینری، بستگی به این داره که چطور ازشون استفاده کنیم.

عملگرهای ریاضی هم که توی جاوااسکریپت زیاد استفاده می شن مثل جمع (+)، تفریق (-)، ضرب (*) و تقسیم (/) رو هم بررسی کردیم. دو تا عملگر باقیمانده (%) و توان (**) هم خیلی جالبن. باقیمانده می ره باقی مونده تقسیم رو نشون می ده و توان هم می ره یه عدد رو به توان عدد دیگه می رسونه. جالبه که می تونیم از توان های اعشاری هم استفاده کنیم، مثلاً ریشه دوم یا سوم یه عدد رو بگیریم.

همچنین، توی جاوااسکریپت عملگر جمع (+) وقتی با رشته ها برخورد می کنه، به جای جمع کردن اونا رو به هم می چسبونه. این یعنی می تونه به جای جمع، ترکیب رشته ها انجام بده. مثلاً اگر '1' + 2 رو بنویسیم، خروجی میشه "12" نه 3!

عملگر مثبت تک عملوندی (+) هم یه ویژگی جالب داره که می تونه چیزهایی رو که عدد نیستن (مثلاً رشته یا بولین) به عدد تبدیل کنه.

اگه بخوایم توی کدها مون مقادیر رو سریع تغییر بدیم، عملگرهایی مثل += یا *= به کمکمون میان. اینا به جای نوشتن کدهای طولانی تر، کار رو سریع تر می کنن.

در نهایت هم اومدیم و عملگرهای ++ و -- رو بررسی کردیم که برای افزایش یا کاهش مقدار متغیر استفاده می شن. فرق پیشوندی و پسوندی این دو هم گفته شد که ممکنه تاثیر متفاوتی روی کد بذاره.

امیدوارم این خلاصه بهت کمک کرده باشه تا با عملگرهای جاوااسکریپت راحت تر کار کنی!

سحر پاشائی
دیدگاه کابران
سفر یادگیری را با سون لرن آغاز کنید

دفتر تهران: تهران، خیابان سهروردی شمالی، خیابان هویزه شرقی، پلاک 20، طبقه دوم، واحد 6

تلفن مشاوره

تمام حقوق این وبسایت برای سون لرن محفوظ می باشد.