Rest parametrlar va spread
Ko'p JavaScript funksiyalari ixtiyoriy sondagi argumentni qabul qila oladi โ masalan Math.max(1, 2, 3, 4). Bunday funksiyalarni yozish va massivlarni argumentlarga aylantirish uchun rest va spread sintaksisidan foydalanamiz. Ikkalasi ham uchta nuqta ... bilan yoziladi.
Rest parametrlar ...rest
Funksiya e'lon qilinganidan ortiqcha argument bilan chaqirilsa, JavaScript xatolik bermaydi โ ortiqcha argumentlarni oddiygina e'tiborsiz qoldiradi. Ammo biz ularning hammasini yig'ib olishimiz mumkin โ buning uchun oxirgi parametr oldiga ... qo'yamiz:
...numbers โ bu "qolgan barcha argumentlarni numbers nomli massivga yig'" degani. So'zning o'zi ham shundan โ rest inglizcha "qolgani" degan ma'noni bildiradi.
Rest parametrdan oldin oddiy parametrlar ham bo'lishi mumkin. Ular birinchi argumentlarni oladi, qolgani esa restga tushadi:
function f(arg1, ...rest, arg2) โ bu xatolik (SyntaxError), chunki restdan keyin boshqa parametr bo'lishi mumkin emas.Eski usul: "arguments" obyekti
Eski JavaScript'da (rest parametrlar paydo bo'lishidan oldin) barcha argumentlarni olishning yagona yo'li maxsus arguments obyekti edi. U funksiya ichida avtomatik mavjud bo'ladi va indeks bo'yicha barcha argumentlarni saqlaydi:
arguments โ massivga o'xshaydi, lekin haqiqiy massiv emas. Unda .map(), .filter() kabi massiv metodlari yo'q. Shu sabab bugungi kunda deyarli har doim rest parametrlar afzal ko'riladi.arguments obyekti umuman bo'lmaydi. Shu holatlarda ham rest parametrlar yagona to'g'ri yechim.Spread sintaksisi ...spread
Rest parametr argumentlarni massivga yig'ardi. Spread esa buning aksi โ u massiv (yoki boshqa iteratsiyalanuvchi)ni alohida elementlarga yoyadi.
Klassik masala: Math.max alohida sonlarni kutadi, massivni emas. Massivdagi eng katta sonni topish uchun spread yordam beradi:
Bir necha massivni yoki oddiy qiymatlarni birlashtirib ham chaqirish mumkin:
Spread bilan massivlarni yoyish va birlashtirish
Spreadni yangi massiv literali ichida ham ishlatish mumkin โ u massivni to'g'ridan-to'g'ri boshqa massivga "quyib" beradi:
Spread har qanday iteratsiyalanuvchi (iterable) bilan ishlaydi โ jumladan satr (string) bilan ham. Satrni belgilar massiviga aylantirish oson:
Spread bilan nusxa olish
Spread massiv va obyektning sayoz nusxasini (shallow copy) olishning eng qulay usuli. Bu yerda muhim jihat bor โ massivni oddiygina boshqa o'zgaruvchiga tenglash nusxa yaratmaydi, faqat bir xil massivga ikkita nom beradi:
Xuddi shu usul obyektlar uchun ham ishlaydi:
structuredClone).... bo'lsa-da, ular teskari ishlarni bajaradi.Xulosa
- Rest parametr
...nameโ funksiya e'lonida qolgan barcha argumentlarni haqiqiy massivga yig'adi; doim oxirgi bo'ladi; - Eski
argumentsobyekti ham argumentlarni beradi, lekin u massiv emas va strelka funksiyalarda yo'q โ hozir rest afzal; - Spread
...arrโ iteratsiyalanuvchini alohida elementlarga yoyadi (masalanMath.max(...arr)); - Spread massiv/obyektlarni birlashtirish va nusxa olish uchun juda qulay (sayoz nusxa).