احتمالاً با خیلی از عملگرها از دوران مدرسه آشنا هستی، مثل جمع (+)، ضرب (*)، تفریق (-) و این جور چیزها. حالا تو این مقاله قراره علاوه بر آشنایی با عملگرهای ساده، یه سری نکات خاص جاوااسکریپتی رو یاد بگیریم که شاید توی ریاضی مدرسه بهشون اشاره نشده باشه.
قبل از اینکه بریم سراغ عملگرها، یه سری اصطلاح ساده ولی مهم رو باید بدونی:
عملگر یوناری (Unary Operator): وقتی یه عملگر فقط یه دونه عملوند داشته باشه، بهش میگیم "یوناری". مثلاً عملگر منفی (-) که علامت عدد رو برعکس میکنه.
let x = 1;
x = -x; // حالا x منفی شده
alert(x); // -1let 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); // 18 تقسیم بر 3: حاصل تقسیم ۲ هست و باقی مونده ۲ میمونه.
alert(8 % 3); // 28 تقسیم بر 4: اینجا چون ۸ کاملاً بر ۴ بخش پذیره، باقی مونده ۰ میشه.
alert(8 % 4); // 0عملگر توان (**) عدد اول رو به توان عدد دوم میرسونه. همون چیزی که توی ریاضی بهش میگیم "توان" یا "به توان رسوندن".
مثال ها:
2 به توان 2: یعنی 2 * 2 که میشه ۴.
alert(2 ** 2); // 42 به توان 3: یعنی 2 * 2 * 2 که میشه ۸.
alert(2 ** 3); // 82 به توان 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"چرا اینطوری شد؟
اینجا + از چپ شروع میکنه:
برخلاف + که با رشتهها رفتار خاصی داره، بقیه عملگرهای ریاضی مثل -، /، * همیشه با عددها کار میکنن و اگه عملوندی رشته باشه، سعی میکنن اون رو به عدد تبدیل کنن.
مثال ها:
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 ); نکته آخر: اگه با داده هایی سر و کار داری که ممکنه رشته باشن ولی قراره به صورت عددی استفاده بشن، + تک عملوندی یه ابزار سریع و تمیز برای تبدیل اونها به عدد هست. پس برای راحتی کار، ازش استفاده کن و از نتایج شسته رفتش لذت ببر!
تو جاوااسکریپت، وقتی یه عبارت شامل چند تا عملگر باشه، ترتیب اجراشون رو یه چیزی به اسم اولویت عملگرها (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
اینجا چی شد؟
نکته مهم: این نوع کدها شاید تو بعضی جاها ببینیم، ولی نوشتنش زیاد توصیه نمیشه چون خوندنش برای دیگران سخت میشه.
یه ویژگی جالب دیگه تو جاوااسکریپت اینه که میتونی چندتا متغیر رو زنجیره ای مقداردهی کنی. مثلاً:
let a, b, c;
a = b = c = 2 + 2;
alert(a); // 4
alert(b); // 4
alert(c); // 4
اینجا چی شد؟
خوندنیتر کردن کد
چنین زنجیره هایی ممکنه خوندن کد رو سخت کنه. برای همین بهتره این جور کدها رو به چند خط تقسیم کنی:
c = 2 + 2;
b = c;
a = c;این روش خوندن کد رو سادهتر و درک رو سریعتر میکنه.
عملگر = فقط یه علامت ساده نیست، بلکه یه عملگره که:
یادت باشه این قابلیتها رو هوشمندانه استفاده کنی و کدت رو همیشه قابل فهم بنویسی!
خیلی وقتا لازم میشه یه عملیات ریاضی رو روی یه متغیر انجام بدیم و نتیجه رو دوباره تو همون متغیر ذخیره کنیم.
مثال:
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یکی از رایجترین کارا توی ریاضی، زیاد یا کم کردن یه مقدار به اندازه ۱ هست. جاوااسکریپت برای این کار عملگرهای خاصی داره:
این عملگر یه مقدار به متغیر اضافه میکنه:
let counter = 2;
counter++; // مثل counter = counter + 1 ولی کوتاه تر
alert(counter); // 3این عملگر یه مقدار از متغیر کم میکنه:
let counter = 2;
counter--; // مثل counter = counter - 1 ولی کوتاه تر
alert(counter); // 1نکته مهم: این عملگرها فقط روی متغیرها کار میکنن. اگه بخوای ازشون روی مقادیر ثابت استفاده کنی (مثل 5++)، بهت خطا میده.
این عملگرها میتونن قبل یا بعد از متغیر قرار بگیرن:
هر دوشون کارشون یکیه: متغیر رو یک واحد زیاد (یا کم) میکنن. اما فرقشون زمانی معلوم میشه که بخوای از مقدار برگشتی این عملگرها استفاده کنی.
فرق پیشوندی و پسوندی
همه ی عملگرها یه مقداری برمی گردونن. اینم استثنا نیست.
مثال:
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) توی جاوااسکریپت با اعداد به صورت 32 بیتی کار میکنن و عملیاتشون رو روی نمایش باینری (دودویی) اون اعداد انجام میدن.
این عملگرها مخصوص جاوااسکریپت نیستن و توی بیشتر زبانهای برنامه نویسی استفاده میشن.
لیست عملگرهای بیت به بیت:
این عملگرها خیلی کم استفاده میشن، مخصوصاً توی توسعه وب.
اما توی حوزه هایی مثل رمزنگاری (cryptography) و کارهای تخصصی تر، خیلی کاربرد دارن.
اگه زمانی نیاز داشتی، میتونی از مستندات MDN برای یادگیری عمیقتر کمک بگیری.
عملگر کاما (,) یکی از عجیبترین و کم استفادهترین عملگرهاست، ولی گاهی برای کوتاهتر کردن کد به کار میره.
این عملگر اجازه میده چندتا عبارت رو با کاما از هم جدا کنیم.
نکته: تمام عبارتها اجرا میشن، ولی فقط نتیجه ی آخرین عبارت برگردونده میشه.
مثال:
let a = (1 + 2, 3 + 4);
alert(a); // 7 (نتیجه 3 + 4)اینجا چی شد؟
عملگر کاما اولویت خیلی پایینی داره، حتی پایینتر از عملگر =.
به همین خاطر، اگه از پرانتز استفاده نکنیم، نتیجه اشتباه میشه:
let a = 1 + 2, 3 + 4;این کد این جوری تفسیر میشه:
برای همین استفاده از پرانتز خیلی مهمه.
گاهی برای نوشتن چند عملیات توی یک خط از این عملگر استفاده میکنن.
مثال:
// سه عملیات توی یه خط
for (a = 1, b = 3, c = a * b; a < 10; a++) {
...
}خب، راستش این روش میتونه توی فریم ورکهای جاوااسکریپت یا کدهای پیچیده دیده بشه.
اما معمولاً خوانایی کد رو کم میکنه. پس بهتره قبل از استفاده، حسابی فکر کنیم!

بعد از اجرای کد زیر، مقدار نهایی متغیرهای a، b، c و d چیه؟
let a = 1, b = 1;
let c = ++a; // ?
let d = b++; // ?let a = 1, b = 1;
alert( ++a ); // 2، حالت پیشوندی مقدار جدید رو برمی گردونه
alert( b++ ); // 1، حالت پسوندی مقدار قدیمی رو برمی گردونه
alert( a ); // 2، یک بار افزایش یافته
alert( b ); // 2، یک بار افزایش یافتهبعد از اجرای کد زیر، مقدار a و x چیه؟
let a = 2;
let x = 1 + (a *= 2);
let a = 2;
let x = 1 + (a *= 2); // a ضربدر 2 میشه، یعنی 4. بعد 1 + 4 محاسبه میشه.
alert(a); // 4
alert(x); // 5این مقاله یه خلاصه از عملگرهای جاوااسکریپت بود که بهمون کمک میکنه اگه خواستیم محاسبات ریاضی انجام بدیم، درست و سریع پیش بریم. تو این مقاله به چندتا نکته مهم اشاره شد:
اول از همه، عملگرها رو معرفی کردیم که شامل عملگرهای یوناری (مثل منفی که فقط یه عملوند میخواد) و باینری (مثل جمع یا تفریق که دو عملوند میخوان) میشه. بعدش فهمیدیم که بعضی عملگرها مثل علامت منفی میتونن هم یوناری باشن هم باینری، بستگی به این داره که چطور ازشون استفاده کنیم.
عملگرهای ریاضی هم که توی جاوااسکریپت زیاد استفاده میشن مثل جمع (+)، تفریق (-)، ضرب (*) و تقسیم (/) رو هم بررسی کردیم. دو تا عملگر باقیمانده (%) و توان (**) هم خیلی جالبن. باقیمانده میره باقی مونده تقسیم رو نشون میده و توان هم میره یه عدد رو به توان عدد دیگه میرسونه. جالبه که میتونیم از توانهای اعشاری هم استفاده کنیم، مثلاً ریشه دوم یا سوم یه عدد رو بگیریم.
همچنین، توی جاوااسکریپت عملگر جمع (+) وقتی با رشتهها برخورد میکنه، به جای جمع کردن اونا رو به هم میچسبونه. این یعنی میتونه به جای جمع، ترکیب رشتهها انجام بده. مثلاً اگر '1' + 2 رو بنویسیم، خروجی میشه "12" نه 3!
عملگر مثبت تک عملوندی (+) هم یه ویژگی جالب داره که میتونه چیزهایی رو که عدد نیستن (مثلاً رشته یا بولین) به عدد تبدیل کنه.
اگه بخوایم توی کدها مون مقادیر رو سریع تغییر بدیم، عملگرهایی مثل += یا *= به کمکمون میان. اینا به جای نوشتن کدهای طولانی تر، کار رو سریعتر میکنن.
در نهایت هم اومدیم و عملگرهای ++ و -- رو بررسی کردیم که برای افزایش یا کاهش مقدار متغیر استفاده میشن. فرق پیشوندی و پسوندی این دو هم گفته شد که ممکنه تاثیر متفاوتی روی کد بذاره.
امیدوارم این خلاصه بهت کمک کرده باشه تا با عملگرهای جاوااسکریپت راحتتر کار کنی!
دوره الفبای برنامه نویسی با هدف انتخاب زبان برنامه نویسی مناسب برای شما و پاسخگویی به سوالات متداول در شروع یادگیری موقتا رایگان شد: