الراحة وانتشار
تدعم العديد من وظائف JavaScript المضمنة عددًا عشوائيًا من الوسائط.
على سبيل المثال:
Math.max (arg1, arg2, ..., argN)
- تحسب الحد الأقصى لعدد الوسائط التي تم تمريرها.
Math.min (arg1, arg2, ..., argN)
- تُرجع الحد الأدنى لقيمة الوسيطات التي تم تمريرها.
في هذه المقالة ، سوف نتعلم كيفية القيام بنفس الشيء مع وظائفنا وكيفية تمرير المعلمات إلى وظائف مثل المصفوفة.
المعلمات المتبقية(... الباقي)
يمكنك استدعاء دالة بأي عدد من المتغيرات ، بغض النظر عن كيفية تعريفها.
على سبيل المثال 👇:
لن تتسبب الحجج الإضافية في حدوث خطأ ، ولكن بالطبع سيتم احتساب الثلاثة الأولى فقط.
مفهوم ES6
بدءًا من معيار ES6 ، ظهر مفهوم مثل... rest
- المعلمات المتبقية.
let goFun = (...rest) => {
// Algorithm
}
يمكن الإشارة إلى المعلمات المجانية بثلاث نقاط...
. يعني حرفيا: "جمع المعلمات المتبقية ووضعها في مصفوفة."
على سبيل المثال ، دعنا نجمع كل المتغيرات في مصفوفة args
👇:
الجواب بالفعل 28 ولا توجد أخطاء🙅♂️! حاول تغيير الوسيطات أو أبعاد المصفوفة.
معلمات متعددة
يمكننا وضع المعلمات القليلة الأولى في المتغيرات🔔, وجمع الباقي في مصفوفة.
هذا يعني أنه يمكنك ببساطة إدراج ملفات ... rest
, ولكن فقط بدلاً من المعلمة الأخيرة للوظيفة.
let goFun = (first, second, ...rest) => {
// Algorithm
}
في المثال أدناه ، الأولين 2️⃣ ستصبح وسيطات الوظيفة الاسم الأول والأخير ، وستصبح الوسيطات الثالثة واللاحقة هي المصفوفة titles [i]
👇:
أخطاء محتملة
يجب أن تكون المعلمات المتبقية في النهاية ، لذا لا يمكنك كتابة 🖊️ أي شيء بعدها. سيؤدي هذا إلى ظهور خطأ:
function f(arg1, ...rest, arg2) { // arg2 после ...rest ?
// Mistake!
}
::: ملاحظة تذكر
... rest
يجب أن يكون دائمًا أخيرًا.
:::
عامل الانتشار ... انتشار
لقد تعلمنا كيفية الحصول على مصفوفة من قائمة معلمات ، لكن في بعض الأحيان تحتاج إلى القيام بالعكس - حشو المصفوفة في الوظيفة المسماة.
على سبيل المثال ، هناك وظيفة مضمنة⚙️ Math.max
. تقوم بإرجاع أكبر رقم في القائمة:
ليس بسيط جدا
لنفترض أن لدينا مجموعة من الأرقام [3, 5, 1]
. كيف تتصل Math.max
لذلك؟
لا يمكنك فقط إدراجها -Math.max
تتوقع الحصول على قائمة أرقام ، وليس مصفوفة واحدة.
بالطبع يمكننا إدخال الأرقام يدويًا: Math.max (arr[0], arr[1], ar[2]).
لكن ، أولاً ، يبدو سيئًا ، وثانيًا ، لا نعرف دائمًا عدد الحجج الموجودة. يمكن أن يكون هناك الكثير منهم ، أو لا يوجد على الإطلاق.
حدوث المعلمات
ال...spread
عامل سيساعدنا هنا. إنه مشابه للمعلمات المتبقية - يستخدم أيضًا `` ... '' ، لكنه يفعل العكس تمامًا.
عندما ...spread
يتم استخدام الوظيفة في استدعاء دالة ، فهي تحول كائن المصفوفة arr
إلى قائمة وسيطات.
لMath.max
👇:
بالطريقة نفسها ، يمكننا تمرير العديد من العناصر التكرارية 👇:
رائع! نهج مرن للغاية للبرمجة. يمكنك أيضًا دمج عامل الانتشار مع القيم العادية.
دمج المصفوفات
عامل الانتشار ... spread
يمكن أيضًا استخدامها لدمج المصفوفات👇:
التحويل إلى سلسلة
ال... spread
تعمل وظيفة المشغل مع أي كائن قابل للتكرار.
على سبيل المثال ، عامل الانتشار مناسب لتحويل سلسلة إلى مصفوفة من الأحرف👇:
let str = 'Hey, Alex!'
let result = [...str]
دعونا نرى ما سيحدث. تحت غطاء المحرك ، يستخدم عامل الانتشار التكرارات للتكرار على العناصر. تماما مثلfor..of
يفعل.
الfor..of
حلقة تتكرر عبر السلسلة كسلسلة من الأحرف ، لذا من ... str
اتضح أن "P" و "p" و "و" in "و" e "و" t "...
يتم جمع الأحرف الناتجة في مصفوفة باستخدام التصريح القياسي للمصفوفة🗣️ [... str] .
يمكننا أيضًا استخدامArray.from
لهذه المهمة. كما أنه يحول متكررًا (مثل سلسلة نصية) إلى مصفوفة 👇:
let str = 'Hello'
Array.from(str) // "H", "e", "l", "l", "o"
// Array.from converts an iterable to an array
والنتيجة هي نفسها[...str]
. لكن هناك فرق بين Array.from(obj)
و [...obj]
:
Array.from
يعمل مع كل من المصفوفات الزائفة والمتكررة.- ال
... spread
يعمل المشغلonly
مع كائنات قابلة للتكرار.
لذلك، Array.from
هي طريقة أكثر عمومية.
مجموع
عندما نرى"..."
في الكود ، يمكن أن تكون إما المعلمات المتبقية...rest
أو عامل التمديد ...spread
.
كيف نميزهم عن بعضهم البعض:
- إذا كان
...
موجودًا في نهاية قائمة وسيطات الدالة ، فهذه هي "المعلمات المتبقية". يقوم بجمع بقية الحجج غير المحددة وإنشاء مصفوفة منها. - إذا حدث
...
في استدعاء دالة أو في مكان آخر ، فهو "عامل تمديد". يستخرج عناصر من مصفوفة لتهيئة الوظيفة.
من المفيد أن تتذكر:
تُستخدم المعلمات المتبقية لإنشاء وظائف جديدة بعدد غير محدد من الوسائط.
باستخدام معامل الانتشار ، يمكنك إدراج مصفوفة في دالة تعمل افتراضيًا مع قائمة عادية من الوسائط.
"معًا ، تجعل هذه التركيبات من السهل تحويل مجموعات القيم من المصفوفات وإليها.
مشاكل؟
اكتب لDiscord محادثة.
أسئلة:
إذا كان `... 'موجودًا في نهاية قائمة وسيطات الدالة ، فإننا نتعامل مع:
- المعلمة المتبقية
- مشغل التوسع
- مؤشرات عشوائية
لإنشاء دالة بعدد غير محدد من الوسائط ، استخدم:
- المعلمات المتبقية
...rest
- عامل الانتشار
...spread
- وظائف المكالمات الخارجية
يمكنك دمج صفيفين في صفيف واحد باستخدام:
- مشغل التوسع
- عامل التشغيل "Array.from"
- المعلمة المتبقية
لفهم مقدار ما تعلمته في هذا الدرس ، قم بإجراء الاختبار في mobile application من مدرستنا في هذا الموضوع.
الروابط
- MDN web doc. Spread syntax article
- Residual Parameters and the Spread Operator article
- The article "The spread and rest operator"
المساهمون ✨
الشكر يعود إلى هؤلاء الأشخاص الرائعين (emoji key):
Dmitriy K. 📖 | Dmitriy Vasilev 💵 | Resoner2005 🐛 🎨 🖋 | Navernoss 🖋 🐛 🎨 |