عملگر توان در جاوا اسکریپت – توضیح به زبان ساده + مثال و کد


عملگر توان در جاوا اسکریپت که در «ECMAScript 2016 (ES7)» معرفی شد، روشی مختصر برای به توان رساندن اعداد در زبان برنامه نویسی جاوا اسکریپت است. این عملگر جایگزینی مناسب برای متد «Math.pow()» به منظور محاسبات توان بهحساب میآید. «سینتکس» (Syntax) این «عملگر» (اپراتور | Operator) بسیار ساده است و خوانایی کد را افزایش میدهد و از طرفی دیگر عملیات ریاضی را در برنامه نویسی جاوا اسکریپت کارآمدتر میکند. در این مطلب آموزشی از «مجله فرادرس» این بار قصد داریم که در رابطه با عملگر توان در زبان برنامه نویسی جاوا اسکریپت توضیحاتی مطلوب ارائه داده و چندین مثال عملی را برای آن به زبانی ساده و روان بررسی کنیم.
عملگر توان در جاوا اسکریپت چیست؟
جاوا اسکریپت با استفاده از عملگر توان که با علامت دو ستاره «**» نشان داده میشود، رویکردی ساده برای انجام محاسبات به توان رساندن اعداد ارائه میدهد. این عملگر فرآیند به توان رساندن اعداد را فراهم میکند و نیاز به متد استاتیک Math.pow() با سینتکس پیچیدهتر را از بین میبرد.
سینتکس متد Math.pow()برای به توان رساندن عددی خاص در مبنایی مشخص به صورت زیر است:
1Math.pow(base, exponent)
مثال زیر هم نحوه استفاده از این متد را نشان میدهد:
1let result = Math.pow(2,2);
2console.log(result); // 4
3
4result = Math.pow(2,3);
5console.log(result); // 8
در «ECMAScript 2016»، روشی جدید برای به توان رساندن اعداد ایجاد شد. این روش با معرفی عملگر توان (**) به وجود آمد که در آن از سینتکسی کاملاً جدید برای انجام این کار استفاده میشود. این عملگر به عنوان جایگزینی برای رویکرد مرسوم استفاده از تابع Math.pow()عمل میکند که سینتکس آن به صورت زیر است:
1base ** exponent
در سینتکس فوق، baseبه معنای عدد پایه و exponentهم نمای آن است. برای مثال اگر baseبرابر با ٣ و exponentبرابر با ٤ باشد در نتیجه دستور بالا عدد ٣ را به توان عدد ٤ میرساند که نتیجه محاسبه عدد ٢٧ خواهد بود. هماکنون استفاده از متد Math.pow()برای چنین محاسباتی رایج نیست و بهجای آن از عملگر توان در جاوا اسکریپت استفاده میشود. عملگر توان در Javascript وضوح و کارایی کد را افزایش میدهد. مثال زیر نحوه استفاده از این عملگر را بیان میکند:
1let result = 2 ** 2;
2console.log(result); // 4
3
4result = 2 ** 3;
5console.log(result); // 8
عملگر توان نهتنها با سینتکس در حال تکامل جاوا اسکریپت همسو است، بلکه به تجربه کدنویسی قابلدرکتر و آسانتر نیز کمک میکند.

نکته: در حالی که توان نوعی عملیات ریاضی رایج محسوب میشود، برخی از زبانهای برنامه نویسی از نماد ^برای این منظور استفاده میکنند. با این حال، در مورد جاوا اسکریپت، این نماد نقش متفاوتی دارد و به عنوان نماد عملگر «XOR» به عنوان یکی از عملگرهای بیتی نقش ایفا میکند. نکته قابل توجه در رابطه با تصمیم توسعهدهندهگان جاوا اسکریپت برای استفاده از عملگر توان با علامت **بهجای استفاده از نماد ^نشاندهنده تعهد این زبان به ارائه سینتکسی منسجم و متمایز برای اپراتورهای مختلف است که در نهایت وضوح کد را افزایش میدهد.
مثال عملگر توان در جاوا اسکریپت
مثال زیر برای درک بهتر عملگر توان در جاوا اسکریپت آورده شده است:
1let result = 2 ** 2;
2console.log(result); // 4
3
4result = 2 ** 3;
5console.log(result); // 8
برخلاف متدMath.pow()که برای محاسبه نیاز به تبدیل مقدار دارد، عملگر توان برای کار با مقادیر عددی طراحی شده است. همچنین این عملگر با نوع داده «Bigint» سازگاری دارد که در سناریوی زیر میتوان این سازگاری را مشاهده کرد.
1let result = 2n ** 3n;
2console.log(result); // 8n
نکته: اعداد BigInt در جاوا اسکریپت برای نشان دادن اعداد صحیح با طول دلخواه مورد استفاده قرار میگیرند. این اعداد نیز نوعی دیگری از انواع داده Number در جاوا اسکریپت محسوب میشوند و گاهی اوقات موردنیاز هستند زیرا اعداد معمولی نمیتواند بهآسانی از 253بیشتر شوند یا کمتر از -253باشند.
1let result = 2n ** 3n;
2console.log(result); // 8n
توجه به این نکته هم خالی از لطف نیست که اپراتور توان در جاوا اسکریپت فقط به عبارات مستقل محدود نمیشود و این عملگر نماد infixنیز قابلیت استفاده و یکپارچگی را دارد که مثال زیر این مفهوم را بیان میکند:
1let x = 2;
2x **= 4;
3console.log(x); // 16
در اصل، عملگر توان در جاوا اسکریپت، در ارتباط با همتای خود یعنی Math.pow()، پایهای قویتر برای محاسبه مقادیر نمایی ایجاد میکند. این عملگر چه به صورت استاندارد و چه به صورت BigInt، به تطبیقپذیری جاوا اسکریپت در مدیریت محاسبات عددی متنوع کمک خواهد کرد.
خطاهای رایج در استفاده از عملگر توان در Javascript
در رابطه با عملگر توان در جاوا اسکریپت، توجه به این نکته مهم است که قرار دادن نوعی عملگر «یکانی» (Unary) مستقیماً قبل از عدد پایه ممنوع است. هرگونه تلاشی برای انجام این کار باعث ایجاد نوعی «خطای نحوی» (Syntax Error) میشود. مثال زیر برای بیان این مفهوم است:
1let result = -2**3; // Causes SyntaxError
کد بالا خطای زیر را ایجاد میکند.
Uncaught SyntaxError: Unary operator used immediately before exponentiation expression. Parenthesis must be used to disambiguate operator precedence
برای اصلاح این وضعیت باید از علامت پرانتز برای اولویت بندی محاسبات استفاده کرد. علامتهای پرانتر مورد استفاده در این رویکرد به طور مؤثر ابهام اولویت عملگرها را حل میکند که مثال زیر برای بیان این مفهوم است:
1let result = (-2)**3;
2console.log(result); // -8
استفاده از پرانتزها برای انجام این کار نوعی احتیاط برای استفاده قوانین نحوی جاوا اسکریپت است و بر اهمیت اولویتبندی صحیح عبارات با پرانتز برای اطمینان از اجرای روان و بدون خطای تأکید میکند.
توضیحات و مثالی که در بالا آورده شد به این معنی است که کاربر وقتی میخواهد بلافاصله قبل از عدد از عملگر Unary استفاده کند (مانند علامت منفی (-)) قوانین نحوی جاوا اسکریپت این اجازه را به او نمیدهد. دلیل این امر به این مسئله بازمیگردد که جاوا اسکریپت عبارت را بهگونهای تفسیر میکند که ممکن است منجر به ابهام یا رفتار غیرمنتظره شود. برای مثال عبارت -2**3را در نظر بگیرید. این محاسبات را میتوان به دو صورت مختلف تفسیر کرد: به عنوان- (2 ** 3) (که به معنای منفی نتیجه عبارت ٢ به توان ٣ است) یا به صورت (2-) ** 3(که به معنای به توان رساندن عدد منفی ٢ به توان ٣ است). برای جلوگیری از این ابهام، جاوا اسکریپت از کاربر میخواهد که از پرانتز استفاده کرده تا بهصراحت ترتیب عملیات مورد نظر را مشخص کند.
مثالی برای اولویت بندی عملگرها در توان
هنگامیکه عبارتی به صورت a ** b ** cموجود باشد، عملیات از راست به چپ ارزیابی میشوند، به این معنی که در عبارت قبلی، نتیجه عبارت a ** (b ** c)محاسبه میشود. برای مثال متغیرهای a = 5 و "b = 2" ، c = 2مفروض هستند و قطعه کد زیر برای آنها مدنظر است:
1a ** b ** c; // Evaluates to 625
2// Execution order of a ** b ** c;
3// (5 ** (2 ** 2) )
4// (5 ** 4)
5// 625
همانطور که گفته شد جاوا اسکریپت قانونی را اعمال میکند که در آن کاربر نمیتواند از عملگرهای یکانی خاصی (+/-/~/!/delete/void/typeof) بلافاصله قبل از عدد پایه در چنین عباراتی استفاده کند. تلاش برای انجام این کار منجر به خطای نحوی میشود. به عنوان مثال، عملیات زیر برای عملگر توان در جاوا اسکریپت نامعتبر هستند و نوعی خطا ایجاد میکنند:
1+a ** b; // Invalid
2-a ** b; // Invalid
3~a ** b; // Invalid
4!a ** b; // Invalid
5delete a ** b; // Invalid
6void a ** b; // Invalid
7typeof a ** b; // Invalid
هر یک از این عملیات منجر به نوعی Error Syntax Uncaughtمیشود زیرا در آنها عملگر Unary بلافاصله قبل از اعلان عملگر توان استفاده شده است. در این شرایط همانطور که بیان شد باید از پرانتز برای اولویتبندی عملگرها استفاده کرد.
برخورد عملگر توان در جاوا اسکریپت با مقادیر منفی
برخورد با اعداد منفی در زمینه استفاده از عملگر توان در Javascript مستلزم بررسی دقیقی است. مثال زیر برای درک این مفهوم اهمیت زیادی دارد.
1-2 ** 2; //invalid
2// The above expression can be converted into
3(-2) ** 2; // 4
4(-2) ** 3; //-8
در مثال بالا استفاده از عبارت -2 ** 2به طور مستقیم به دلیل ابهام احتمالی نامعتبر است. برای روشن شدن هدف، میتوان آن را بهعنوان (-2) ** 2بازنویسی کرد که به عدد 4 ارزیابی میشود. به طور مشابه، هنگام کار با پایه منفی در توان، مانند (-2) ** 3، نتیجه برابر با -8خواهد شد. با استفاده از قابلیتهای پرانتز، تفسیر واضحی از عملیات توان در جاوا اسکریپت امکانپذیر است.
برخورد عملگر توان در Javascript با مقادیر NAN
انجام عملیات توان در جاوا اسکریپت شامل «NaN (Not-a-Number)» منجر به بازیابی مقدار NaNمیشود که مثال زیر برای بیان این مفهوم آورده شده است.
1NaN ** 1; //NaN
2NaN ** NaN; // NaN
در هر دو مورد، هر عملیات حسابی که با NaNبه عنوان نوعی عملوند انجام شود، NaNرا به عنوان خروجی به کاربر میدهد. این رفتار منعکس کننده ماهیت ذاتی NaNاست که مقادیر تعریف نشده را در محاسبات عددی نشان میدهد.

برخورد عملگر توان در جاوا اسکریپت با مقادیر Undefined
هنگام استفاده از مقدار «تعریف نشده» (Undefined) در عملیات توان، مانند 1 ** undefined، نتیجه NaNخواهد بود که مثال زیر برای بیان این مفهوم آورده شده است:
11 ** undefined; // NaN
این رفتار از این واقعیت نشاءت میگیرد که وقتی در محاسبات عددی از Undefinedاستفاده میشود، این مقدار Undefinedبه طور ضمنی به مقدار NaNتبدیل خواهد شد. در نتیجه، عبارت به 1 ** NaNتبدیل شده که منجر به نتیجه NaNمیشود.
برخورد عملگر توان مقادیر Null
هنگام اعمال عملگر توان در جاوا اسکریپت برای «مقدار تهی» (Null)، رفتار مشابه برخورد این عملگر با مقدار Undefinedخواهد بود. مثال زیر برای بیان این موضوع است:
110 ** null; // 1
2// because
310 ** Number(null); // Number(null) --> 0
410 ** 0; // 1
در مثال فوق Number(null)به 0ارزیابی میشود، در نتیجه هر عددی به توان 0برسد منجر به بازیابی 1خواهد شد. بنابراین، عبارت 10 ** nullبه 10 ** 0تبدیل شده و مقدار 1بازیابی میشود. این پدیده بر این قانون ریاضی تأکید میکند که هر عدد پایه به توان 0برسد نتیجه خروجی عدد 1خواهد بود.
سوالات متداول عملگر توان در Javascript
در این بخش چندتا از خطاهای متداول در رابطه با عملگر توان در جاوا اسکریپت ارائه خواهند شد. توجه به این سوالات به درک کاربران از عملگر توان بسیار کمک خواهد کرد.
در جاوا اسکریپت چگونه اعداد را باید به توان رساند؟
در جاوا اسکریپت دو روش برای به توان رساندن اعداد وجود دارد. روش اول استفاده از متد Math.pow است که دو عملوند را میپذیرد که عملوند اول عدد پایه و عملوند دوم عملگر توان است. همچنین میتوان از عملگر توان که با دوستاره نشان داده میشود، مابین عدد پایه و توان استفاده کرد.
برای انجام عملیات توان، Math.pow بهتر است یا عملگر توان؟
برای انجام عملیات به توان رساندن در جاوا اسکریپت، عملگر توان به دلیل سینتکسی مختصر و خوانایی اغلب به متد Math.pow ترجیح داده میشود. اپراتور توان در جاوا اسکریپت مستقیماً عملیات به توان رسانی اعداد را انجام داده و با این کار به وضوح کد کمک میکند. این عملگر در اصل نیاز به فراخوانی تابعی جداگانه را از بین میبرد و کارایی کد را بهبود میبخشد.
سخن پایانی
عملگر توان به عنوان یکی از عملگرهای جاوا اسکریپت به منظور به توان رساندن عددی پایه به توانی مشخص مورد استفاده قرار میگیرد و جایگزینی بسیار مناسب برای متد Math.pow()است. این عملگر همهکاره بوده و مقادیر عددی و حتی مقادیر Bigint را نیز در خود جای میدهد. در مطلب فوق از مجله فرادرس اطلاعاتی نسبتاً مطلوب از عملگر توان در Javascript بیان شد و در سناریوهای مختلفی اعم از به کار گرفتن در محاسبات عددی و حتی محاسبات Bigint این عملگر مورد استفاده قرار گرفت.
همچنین در مطلب فوق از مجله فرادرس، این عملگر در شرایط مختلفی مانند استفاده با مقادیر منفی، استفاده با مقادیر تعریف نشده، استفاده با مقادیر تهی و استفاده با مقادیر NaNمورد بررسی واقع شد. سازگاری عملگر توان در جاوا اسکریپت با انواع مقادیر مختلف، اهمیت آن را در زمینههای برنامه نویسی مختلف نشان میدهد. به امید اینکه مطلب فوق مورد رضایت کاربران عزیز قرار گرفته باشد.