javascript جافا سكريبت "new Array (n)" و "Array.prototype.map" غرابة





6 Answers

كان لدي مهمة لم أكن أعرف سوى طول الصفيف وتحتاج إلى تحويل العناصر. أردت أن أفعل شيئًا كهذا:

let arr = new Array(10).map((val,idx) => idx);

لإنشاء مصفوفة بسرعة مثل هذا:

[0,1,2,3,4,5,6,7,8,9]

لكنها لم تنجح لأنها: أنظر جواب جوناثان لونوفسكي بضعة أجوبة.

قد يكون الحل لملء عناصر المصفوفة بأي قيمة (حتى مع غير معرّف) باستخدام Array.prototype.fill()

let arr = new Array(10).fill(undefined).map((val,idx) => idx);

console.log(new Array(10).fill(undefined).map((val, idx) => idx));

تحديث

حل آخر يمكن أن يكون:

let arr = Array.apply(null, Array(10)).map((val, idx) => idx);

console.log(Array.apply(null, Array(10)).map((val, idx) => idx));

javascript arrays firefox dictionary firebug

لقد لاحظت هذا في Firefox-3.5.7 / Firebug-1.5.3 و Firefox-3.6.16 / Firebug-1.6.2

عندما أشعل Firebug:

    >>> x = new Array(3)
    [undefined, undefined, undefined]
    >>> y = [undefined, undefined, undefined]
    [undefined, undefined, undefined]

    >>> x.constructor == y.constructor
    true

    >>> x.map(function(){ return 0; })
    [undefined, undefined, undefined]
    >>> y.map(function(){ return 0; })
    [0, 0, 0]

ما الذي يحدث هنا؟ هل هذا خطأ ، أم أنا سوء فهم كيفية استخدام new Array(3) ؟




من صفحة MDC map :

[...] يتم استدعاء callback فقط لفهارس المصفوفة التي تم تعيين قيمة لها ؛ [...]

[undefined] يطبق بالفعل على المؤشر (es) بحيث يتم تكرار map ، في حين أن new Array(1) فقط بتهيئة الفهرس (es) بقيمة افتراضية undefined حتى تتخطىها map .

أعتقد أن هذا هو نفسه لجميع أساليب التكرار .




أعتقد أن أفضل طريقة لشرح ذلك هي النظر إلى الطريقة التي يعالج بها Chrome.

>>> x = new Array(3)
[]
>>> x.length
3

إذن ما يحدث بالفعل هو أن Array () الجديد يقوم بإرجاع صفيف فارغ له طول 3 ، لكن بدون قيم. لذلك ، عند تشغيل x.map على صفيف فارغ تقنيًا ، لا يوجد شيء يمكن تعيينه.

فايرفوكس فقط "يملأ" تلك الفتحات الفارغة مع undefined حتى وإن لم يكن لديه قيم.

لا أعتقد أن هذا خطأ صريح ، فقط طريقة سيئة لتمثيل ما يجري. أفترض أن Chrome "أكثر صحة" لأنه يوضح أنه لا يوجد في الواقع أي شيء في الصفيف.




ركض للتو في هذا. من المؤكد أنه سيكون ملائماً لتكون قادرة على استخدام Array(n).map .

Array(3) تنتج تقريبًا {length: 3}

[undefined, undefined, undefined] ينشئ الخصائص المرقمة:
{0: undefined, 1: undefined, 2: undefined, length: 3} .

لا يعمل تطبيق الخريطة () إلا على خصائص محددة.




إذا كنت تقوم بذلك من أجل ملء صفيف بقيم بسهولة ، فلا يمكنك استخدام fill لأسباب دعم المتصفح ولا تريد حقاً إجراء حلقة for-loop ، يمكنك أيضاً القيام بـ x = new Array(3).join(".").split(".").map(... التي سوف تعطيك مجموعة من السلاسل الفارغة.

لا بد لي من القول قبيح ، ولكن على الأقل يتم توصيل المشكلة والنية بوضوح تام.




في Chrome ، إذا أجريت new Array(3) ، فستحصل على [] ، لذا أعتقد أنك صادفت خطأً في المتصفح.




Related