عملگرها

ما از زمان مدرسه عملگرهای جمع و ضرب و تقسیم و منها رو یاد گرفتیم.

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

شرایط : “unary” ، “binary” ، “operand”

بذارید در ابتدا اصطلاحات رایج رو درک کنیم.

  • عملوند(operand): چیزی هست که عملگر ها رو اون اعمال میشوند. برای مثال برای عمل ضرب دو عملوند داریم. بعضی مواقع افراد با نام آرگومان(arguments) اونو میشناسن در هر دو صورت دوتاش یکی هست.
  • unary :یک عمگر زمانی یک عملوند داشته باشد unaryهست. برای مثال unary منفی ، علامت یک عدد را برعکس می کند:

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

ما در اینجا در مورد دو اپراتور مختلف صحبت می کنیم(unary negation و binary subtraction).

ترکیب رشته یا باینری +

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

اگر یکی از عملگرها یک رشته باشد ، دیگری به یک رشته نیز تبدیل می شود.
برای مثال:

این عملگر در صورتی هر کدام از دو عملوند ها رشته باشند عملوند دیگر را به رشته تبدیل میکند.

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

در صورتی که دو عدد قبل از یک رشته با هم در محاسبات وجود داشته باشند نتیجه آنها با عملوند سومی که رشته هست ترکیب میشود:

 

جمع بندی رشته و تبدیل ویژگی ویژه به علاوه + است. سایر عملگرها فقط با اعداد کار می کنند و همیشه عملکردهای خود را به اعداد تبدیل می کنند.

به عنوان مثال در تفریق و تقسیم داریم:

 

تبدیل عددی ، unary +

عمل جمع به دو صورت وجود دارد مورد اول که در بالا گفتیم و مورد دوم به شکل unary هست.

unary مثبت هیچ تغیری روی اعداد نمیدهد.

مثال:

در واقعا عملگر یکانی وقتی قبل از یک مقدار غیر عددی استفاده میکنیم انگار که از تابع Number استفاده کردیم.

اغلب برای مقادیری که از html گرفتیم نیاز داریم که مقادیر رو به عدد تبدیل کنیم.

در حالت عادی نتیجه درستی رو به ما نمیدهد.

به مثال زید توجه کنید :

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

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

 

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

اگر یک عبارت بیشتر از یک عملگر داشته باشد. آنها با اولویتی که تعریف شده به ترتیب اجرا میشوند.

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

در جاوا اسکریپت تعداد زیادی عملگر وجود دارند که هر کدام اولویت متفاوتی دارند.

اگر تقدم یکسان باشد از سمت چپ به راست اجرا میشن.

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

Precedence Name Sign
۱۶ unary plus +
۱۶ unary negation -
۱۴ multiplication *
۱۴ division /
۱۳ addition +
۱۳ subtraction -
۳ assignment =

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

پس در عبارت “+apples + +oranges” ابتدا بهعلاوه یکانی اعمال و سپس با هم جمع میشوند.

انتساب (Assignment)

علامت انتساب عملگری با اولویت پایینتر هست به همین دلیل نسبتا در آخر همه عملگر ها انجام میشه.

امکان چندین انتساب  به صورت همزمان وجود دارد:

به هم زنجی شده اند محاسبات از راست به چپ انجام میشود.

ابتدا عبارت ۲+۲ محاسبه شده و از چپ به متغیر ها انتساب میشود:c ،  b و a و در نهایت همه متغیر ها مقدار یکاسن دارند.


عملگر انتصاب یک مقدار رو بر میگرداند

یک عملگر همیشه یک مقدار را برمیگرداند.

اغلب عملگر ها مانند ضرب و جمع و تقسیم مقادیر واضحی رو برمیگدانند.

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

با فراخوانی x=value مقدار را در x قرار داده و سپس مقدار ش رو برمیگردونه.

برای درک بهتر به مثال زیر توجه کنید:

در مثال بالا مقدار b با یک جمع شده و عدد ۳ برمیگردد و مقدار c میشود ۳-۳ که نتیجه ۰ حاصل میشود.

شاید کد خنده داری باشه در اصل به منظور اینکه بفهمیم که این عملگر ها چجوری توی جاوا اسکریپت عمل میکنن.


باقیمانده ٪

عملگر باقیمانده ٪ با وجود ضاهرش به درصد مربوط نمیشه.

نتیجهa % b باقی مانده مقدار a تقسیم بر b  میشود.
برای درک بهتر به مثال های زیر توجه کنید:

 

توان **

این عملگر یکی از عملگر های اخیر این زبان هست.

برای عدد طبیعی b  ، نتیجه a**b  میشود به تعداد  b بار a در خودش ضرب میشود.

مثال :

این عملگر با اعداد غیر integer هم کار میکند:

 

کاهش / افزایش

کاهش یا افزایش یکی از متداول ترین عملیات عددی است.

بنابر این عمیات ویژه ای براین اونها وجود دارد:

افزایش ++

 

کاهش --


نکته مهم:
عملیات کاهش و افزایش فقط روی متغیر ها اعمال میشوند.

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


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

“postfix form”: counter++

“prefix  form”: ++counter

تفاوت این دو در این است که در حالت prefix مقدار جدید را برمیگرداند ولی postfix مقدار قبل از افزایش یا کاهش را برمیگرداند.

در زیر تفاوت رو با مثال مشاهده میکنیم:

اگر از نتیجه آن استفاده نمیکنید هیچ تفاوتی بین این دستور ها وجود ندارد.

در غیر اینصورت شما بایدباتوجه به نیاز خودتون که کدوم نوع رو نیاز دارید باید استفاده کنید.

اگر شما به مقدار نهای یا افزایش یا کاهش داده شده نیاز دارید باید از prefix استفاده کنید:

در غیر اینصورت اگر به مقدار قبل از اعمال عملگر نیاز دارید از شکل postfix استفاده کنید:


افزایش یا کاهش در میان عملگر های دیگر

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

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

برای مثال :

مقایسه با:

ب وجود اینکه از نظر فنی خوب است.

معمولا چنین نشانه گذاری باعث کمتر خوانا بودن کد میشود.

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

توصیه ما اینه که هر عملی در یک خط نوشته شود.


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

این عملگر ها با ارگمان ها به عنوان اعداد ۳۲ بیتی رفتار میکنند و در سطح باینری کار میکنند.

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

لیستی از این عملگر ها:

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

این عملگر ها به ندرت استفاده میشوند.

برای درک آنها نیاز دارید که اطلاعاتی درمورد اعداد سطح پایین داشته باشید که در حال حاضر به این بحث مربوط نخواهد بود.

اگر خیلی کنجکاو هستید میتونید در مورد عملگر های بیتی در MDN مطالعاتی داشته باشید.

 

اصلاح متغیر(جایگزینی)Modify-in-place

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

مثلا :

برای کوتاهتر کرده کد بالا میتونیم کد ها رو طبق عبارت زیر بنویسیم:

به صورت خلاصه تغیر میدیم و در متغیر قبل مقدار جدید ذخیره میشود.

برای دیگر عملگر های ریاضی این ساختار رو میتونیم استفاده کنیم.

چنین عملگر هایی اولویت های یکسانی دارند .

بنابراین آنها بعد از محاسبات دیگر اجرا می شوند.

 

کاما

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

عملگر کاما به ما برای محاسبه چندین عبارت اجازه میدهد.

هر یک از عبارت ها رو با کاما جدا میکنیم اما فقط آخرین نتیجه رو برمیگردونه.

برای مثال :

اینجا عبارت اول ۱+۲ محاسبه شده و نتیجه دور ریخته دور ریخته میشود. سپس ۳+۴ محاسبه شده و چون آخرین مقدار هست مقدار اون رو در نتیجه برمیگدونه.


کاما اولویت بسیار پاینی دارد

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

مثال بالا بدون پرانتز کاملا نتیجه دیگه ای میدهد.

a = 1 + 2, 3 + 4

مقدار ۱+۲ شده و در a ریخته میشود و مابقی عبارات نادیده گرفته میشوند.

(a = 1 + 2), 3 + 4


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

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

مثلا :

چنین ترفند های در بسیاری از فریمورک ها جاوا اسکریپت استفاده میشود.

به همین دلیل ما به این مورد هم اشاره کردیم.

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

 

منبع :javascript.info

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *