تبلیغات

آموزش پارامتر rest در جاوا اسکریپت – بی نهایت ورودی در تابع

آموزش پارامتر rest در جاوا اسکریپت - بی نهایت ورودی در تابع

فرض کنید بخواهیم تابعی بنویسیم که دو عدد دریافت کرده و آنها را با یکدیگر جمع کند. بصورت زیر:

اما شاید نیاز داشته باشیم که این تابع بتواند سه عدد نیز دریافت کند:

حالا شاید بعضی اوقات پیش بیاید که تنها دو عدد داشته باشیم؛ پس یعنی بیاییم از همین تابع بالا، بصورت زیر استفاده کنیم:

اما با اجرای آن، مقدار NaN به معنی Not a Number (عدد نیست) چاپ می‌شود! چرا؟! چون وقتی مقداری برای پارامتر c ارسال نکنیم، تابع بالا آن را undefined در نظر گرفته و جمع یک undefined با اعداد، این خروجی را خواهد داشت. شاید بگویید خب به سه عدد نیاز داریم، بیاییم و c را 0 قرار دهیم! اما نه کمی صبر کنید…

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

یعنی با اینکه تابع سه ورودی دریافت می‌کند؛ اما وقتی 4 پارامتر به آن ارسال کنیم، اصلا کاری با پارامترهای اضافی ندارد!!!! پس اگر بخواهیم تابع بتواند مجموعه نامشخصی از اعداد را دریافت کرده و با یکدیگر جمع کند، بایستی تعداد بسیار زیادی ورودی قرار دهیم؟!

روش اول

یک راه این است که بیاییم و فقط یک ورودی برای تابع تعریف کنیم! اما این ورودی قرار است یک آرایه از اعداد باشد:

اما نه صبر کنید! ما گفتیم می‌خواهیم بی‌نهایت ورودی (تعداد ناشمخصی) دریافت کند نه اینکه یک ورودی از نوع آرایه دریافت کند!

روش دوم

حالا بیایید هیچ ورودی برای تابع تعریف نکنیم! در مثال بالا دیدید که توابع جاوا اسکریپت، کاری به کار ورودی‌های اضافی ندارند! اما بیایید ما اجبار کنیم که با این ورودی‌ها هم کار داشته و آنها را هم آدم حساب کنند:

چه جالب! یعنی به کمک خط اول، ورودی‌هایی که برای تابع sum آدم حساب نمیشدند را به دست آورده و درون یک آرایه قرار دادیم! موقع پاس دادن هم نیازی نبود داخل یک آرایه قرار دهیم و همه را به صورت جدا و در قالب 4 ورودی به داخل تابع ارسال کردیم. به خط اول که از ویژگی slice، متد call را صدا میزند دقت کنید. این خط یک ورودی به نام arguments دریافت می‌کند که همان ورودی‌ها هستند و در این آبجکت قرار گرفته‌اند. ورودی دیگر آن نیز طول تابع sum است ولی طول تابع چیست؟! الآن برنامه‌نویسان زبان‌هایی مثل سی‌شارپ و جاوا احتمالا مواردی را به سازندگان این زبان شیرین نسبت می‌دهند 😀

بله، در جاوا اسکریپت هر تابع یک متغیر است که ویژگی‌هایی دارد! و ویژگی length هم تعداد پارامترهای ارسال شده به داخل آن است.

ای بابا! یعنی باید هربار این خط را برای هر تابعی که بخواهیم تعداد ورودی نامشخصی داشته باشد بنویسیم؟! جواب بله و خیر است! یعنی بستگی دارد بخواهید از ویژگی‌های جدید معرفی شده در اکما اسکریپت 6 استفاده کنید یا نه!

اما… اما… و اما!!! قبل از اینکه به آن بپردازیم، اجازه دهید تا یک چیز دیگر را در کد بالا بررسی کنیم:

وااای نه!!! جواب 8 شد چرا؟!!! آهان یک ورودی به نام a تعریف کردیم!!! پس… پس …. پس یعنی این متغیرِ args فقط و فقط شامل ورودی‌هایی خواهد بود که در تابع مشخص نشدند؟! بله درست است! ورودی اول یعنی عدد 1، که مستقیما داخل a قرار خواهد گرفت و سه ورودی دیگر نیز به args انتقال می‌یابند؛ اما دقیقا چرا؟! خب چون ورودی اول، در پارامترهای تابع آدم حساب شده و فقط ورودی‌های بعدی در نظر گرفته نشدند… منطقش اینطور است تقصیر من نیست به جان شما 😀

ولی باز هم نشد! من که خودم خسته میشم هربار این خط دراز را بنویسیم! حتی دیدنش هم یک جوری است! ?

روش سوم و پرامتر rest

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

همانطور که می‌بینید و می‌بینیم (یا شایدم می‌بینیم)، یک ورودی به نام args تعریف کردیم که قبل از آن سه نقطه قرار دارد!!!! به همین سادگی تعداد پارامتر دلخواه تعریف شد!

ولی یک سوال اساسی! اگر قبل از آن یک یا چند متغیر تعریف کنیم؛ مشکلی پیش خواهد آمد؟! یا بعد از آن  چطور؟! یا اصلا چند متغیر می‌توانیم تعریف کنیم که پشتش سه نقطه داشته باشد! آیا می‌شود؟!

  • می‌توان قبل از پارامتر rest، هرچند تا که بخواهیم پارامتر عادی تعریف کنیم.
  • نمی‌توان بعد از پارامتر rest، هیچ پارامتر جدیدی تعریف کرد؛ ولی چرا؟! جواب کاملا واضح است! خب دقیقا وقتی می‌گوییم از اینجا به بعد برای تو (در اینجا منظور از تو پارامتر rest بزرگوار است)، بنابراین تضاد است که بگوییم آن انتهایی برای فلان کس! چراکه اصلا معاوم نیست که در این بین پارامتری باشد یا خیر! (شاید با در نظر گرفتن شرایطی امکان‌پذیر بود! ولی خب پیچیده میشد!)
  • نمی‌توان بیش از یک بار از پارامتر rest در ورودی‌ها استفاده کرد. جواب این نیز واضح است! خب وقتی بتوان قبل از rest، پارامترهای عادی تعریف کرد و نتوان بعد از آن هیچ پارامتری تعریف کرد، پس نمی‌شود دو یا چند rest دز وزودی توابع تعریف کرد.

امیدوارم از آموزش لذت برده باشید.

تبلیغات
0
کانال تلگرام فول کده
تبلیغات

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

هادی اکبرزاده

[ مدیر فول کده ]

علاقه‌مند به اشتراک گذاری اطلاعات در هر زمینه‌ای / برنامه‌نویس و دانشجوی ارشد رشته شبیه‌ساز هوشمند - در حال نوشتن یه رمان (اگه خدا بخواد و تموم شه ?)

پاسخ دهید

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

نظرات ثبت شده بدون دیدگاه