سؤال

أنا أتعامل مع جون ريسيج الممتاز دروس جافا سكريبت المتقدمة ولا أفهم تمامًا ما الفرق بين المكالمات التالية:(يُرجى ملاحظة أن كلمة "arguments" هي كلمة جافا سكريبت مضمنة وليست مصفوفة تمامًا، ومن هنا جاء الاختراق باستخدام Array.slice بدلاً من مجرد استدعاء الوسيطات.slice)

>>> arguments  
[3, 1, 2, 3]  
>>> Array.slice.call( arguments )  
3,1,2,3 0=3 1=1 2=2 3=3  
>>> Array.slice.call( arguments, 1 )  
[]
>>> Array().slice.call( arguments )  
3,1,2,3 0=3 1=1 2=2 3=3  
>>> Array().slice.call( arguments, 1 )  
1,2,3 0=1 1=2 2=3  

يتلخص سوء فهمي في الأساس في الفرق بين Array.slice و Array().slice.ما هو بالضبط الفرق بين هذين الاثنين ولماذا لا يتصرف Array.slice.call كما هو متوقع؟(وهو ما يعيد كل العناصر باستثناء العنصر الأول من قائمة الوسائط).

هل كانت مفيدة؟

المحلول

ليس تماما.

شاهد ما يحدث عند الاتصال بـ String.substring.call("foo", 1) وString().substring.call("foo", 2):

>>> String.substring.call("foo", 1)
"1"

>>> String().substring.call("foo", 1)
"oo"

Array.slice هو لا الإشارة بشكل صحيح إلى وظيفة الشريحة المرفقة بالنموذج الأولي للصفيف ولا وظيفة الشريحة المرفقة بأي مثيل صفيف تم إنشاء مثيل له (مثل Array() أو []).

حقيقة أن Array.slice غير فارغة على الإطلاق هي تطبيق غير صحيح للكائن (/function/constructor) نفسه. حاول تشغيل الكود المكافئ في IE وستحصل على خطأ يفيد بأن Array.slice فارغ.

هذا هو السبب في أن Array.slice لا يعمل بشكل صحيح (ولا String.substring).

إثبات (ما يلي هو شيء لا ينبغي للمرء أن يتوقعه أبدًا بناءً على تعريف الشريحة ()... تمامًا مثل السلسلة الفرعية () أعلاه):

>>> Array.slice.call([1,2], [3,4])
3,4

الآن، إذا قمت باستدعاء Slice() بشكل صحيح على أي كائن تم إنشاء مثيل له أو النموذج الأولي للمصفوفة، سوف تحصل على ما تتوقعه:

>>> Array.prototype.slice.call([4,5], 1)
[5]
>>> Array().slice.call([4,5], 1)
[5]

المزيد من الأدلة...

>>> Array.prototype.slice == Array().slice
true
>>> Array.slice == Array().slice
false

نصائح أخرى

المصفوفة هي مجرد دالة، وإن كانت وظيفة خاصة (تُستخدم لتهيئة المصفوفات).Array.slice هو مرجع إلى وظيفة الشريحة () في النموذج الأولي للصفيف.لا يمكن استدعاؤه إلا على كائن مصفوفة وليس على المُنشئ (أي.المصفوفة) نفسها.يبدو أن المصفوفة تعمل بشكل خاص، حيث تقوم Array() بإرجاع مصفوفة فارغة.يبدو أن هذا لا يعمل مع وظائف المُنشئ غير المضمنة (حيث يتعين عليك استخدام وظائف جديدة).لذا

Array().slice.call

بالضبط مثل

[].slice.call

كيف يعمل أي استدعاء لـlice.call()‎ في الأمثلة المقدمة نظرًا لعدم توفير معلمة السياق؟هل تنفذ الشريحة طريقة الاتصال الخاصة بها، وبالتالي تتجاوز طريقة الاتصال الخاصة بجافا سكريبت؟تأخذ أساليب الاستدعاء والتطبيق كائنًا كمعلمة أولى لتحديد كائن السياق (هذا) الذي سيتم تطبيقه على الاستدعاء.

أعتقد مجموعة مصفوفة هو النوع و مجموعة مصفوفة() هي وظيفة المنشئ.

العبث في FireBug:

>>> Array === Array()
false

>>> Array.constructor
Function()

>>> Array().constructor
Array()

حسنًا،

انظر الى http://www.devguru.com/Technologies/ecmascript/quickref/slice.html

Array().slice هي وظيفة (منشئة) في فئة المصفوفة، ولا يمكن استخدامها كعضو بيانات.إذا كنت لا تريد استخدام '()' فسوف تحتاج إلى استدعائها على المصفوفة.على سبيل المثال - الحجج.شريحة (1)

أعتقد أن Array هو نموذج أولي بينما Array() هو كائن مصفوفة فعلي.اعتمادًا على تفسير JavaScript، قد يعمل الاتصال المباشر بأسلوب النموذج الأولي لنوع كائن مضمن أو قد لا يعمل.لا أعتقد أن المواصفات تقول إنها يجب أن تعمل، فقط أن الاتصال بها على كائن تم إنشاء مثيل له يعمل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top