الراحة وانتشار
تدعم العديد من وظائف 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 🖋 🐛 🎨 |