javascriptRest parametersپارامتر rest در جاوااسکریپت
پارامتر rest در جاوااسکریپت ورودیهای باقیمانده را در آرایه جمع میکند؛ تعداد ورودی متغیر، آرایهٔ خالی و تفاوت آن با spread را با مثال ببینید.
مفهوم به زبان ساده
گاهی تعداد ورودیهای یک تابع از پیش ثابت نیست؛ مثلاً میخواهیم شناسهٔ هر تعداد درس را برای یک گزارش کوچک کنار هم بگذاریم. پارامتر rest با سه نقطه پیش از نام پارامتر نوشته میشود و آرگومانهای باقیماندهٔ آن فراخوانی را در یک آرایهٔ واقعی جمع میکند. این آرایه روشهایی مانند join و reduce را دارد و با شیء قدیمی arguments یکسان نیست.
در مثال، نخستین پارامتر عنوان گزارش است و بقیهٔ ورودیها در lessonIds قرار میگیرند. هر فراخوانی آرایهٔ مربوط به خودش را دارد. اگر پس از عنوان هیچ آرگومانی ندهیم، آرایه خالی است؛ بنابراین طول آن صفر میشود و نیازی به حدسزدن تعداد ورودیها نداریم. نوع و اعتبار هر شناسه همچنان مسئولیت قرارداد تابع است.
فقط یک پارامتر rest میتوان نوشت و باید آخرین پارامتر باشد؛ پس از آن پارامتر یا ویرگول پایانی نمیآید. rest در تعریف تابع مقدارها را جمع میکند، ولی spread هنگام فراخوانی یا ساخت داده، مقدارها را باز میکند. برای تمرین، آرایهای از شناسهها بسازید و با spread آن را به همین تابع بدهید؛ فرستادن خود آرایه بدون spread یک آرگومان آرایهای خواهد بود، نه چند شناسهٔ جدا.
کجا به کار میآید؟
- گرفتن تعداد متغیری شناسه یا مقدار در یک تابع
- جداکردن ورودی ثابت اول از مجموعهٔ ورودیهای بعدی
از تعریف تا یک مثال واقعی
function lessonReport(label, ...lessonIds) {
return label + ': ' + lessonIds.length + ' / ' + (lessonIds.join(', ') || '—');
}
console.log(lessonReport('منتخب', 'js-1', 'js-2'));
console.log(lessonReport('خالی'));
منتخب: 2 / js-1, js-2 خالی: 0 / —
این مثال چطور کار میکند؟
label آرگومان نخست را میگیرد و بقیه به آرایهٔ lessonIds میروند.
فراخوانی نخست دو شناسه دارد و طول آرایهٔ rest برابر ۲ است.
فراخوانی دوم هیچ شناسهای ندارد؛ rest آرایهٔ خالی میسازد.
اشتباه رایج
سه نقطه در همهٔ موقعیتها یک کار نمیکند. lessonReport("منتخب", ids) یک آرایه را بهعنوان یک عضو میفرستد؛ lessonReport("منتخب", ...ids) اعضای آن را جدا میفرستد.
این را به خاطر بسپارید
rest چند آرگومان باقیمانده را جمع میکند؛ جای آن در انتهای فهرست پارامترهاست.