سؤال

وهي كيف البرمجية التالية:

var sup = new Array(5);
sup[0] = 'z3ero';
sup[1] = 'o3ne';
sup[4] = 'f3our';
document.write(sup.length + "<br />");

الإخراج '5' على طول عند كل ما قمت به هو وضع مختلف العناصر ؟

بلدي "مشكلة" مع هذا الرمز هو أنني لا أفهم كيف length التغييرات دون استدعاء getLength() أو setLength() الأسلوب.عندما أفعل أي من الإجراءات التالية:

a.length
a['length']
a.length = 4
a['length'] = 5

على غير كائن مجموعة ، فإنه يتصرف مثل dict / النقابي.عندما أفعل هذا على مجموعة كائن له معنى خاص.ما هي الآلية في جافا سكريبت يسمح لهذا أن يحدث ؟ لا جافا سكريبت يكون بعض نوع من نظام الملكية الذي يترجم

a.length
a['length']

إلى "الحصول على" أساليب

a.length = 4
a['length'] = 5

إلى "مجموعة" الأساليب ؟

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

المحلول

وكل شيء في جافا سكريبت هو كائن. في حالة وجود Array، الخاصية length ترجع حجم منطقة تخزين داخلية لفهرسة المواد المصفوفة. قد تأتي بعض الارتباك في اللعب في هذا المشغل [] يعمل لكلا الوسائط الرقمية وسلسلة. للصفيف، إذا كنت تستخدم مع مؤشر رقمي، فإنها ترجع / يحدد البند فهرستها المتوقع. إذا كنت تستخدم مع سلسلة، فإنها ترجع / بتعيين الخاصية اسمه على وجوه مجموعة - ما لم يتوافق السلسلة إلى قيمة رقمية، ثم تقوم بإرجاع البند مفهرسة. وذلك لأن في جافا سكريبت يجبر أدلة المصفوفة إلى سلاسل من خلال مكالمة toString() ضمنية. بصراحة، هذا هو واحد فقط أكثر من تلك الأشياء التي يجعلك الصفر رأسك ويقول "جافا سكريبت، وهذا، وهذا هو السبب في أنها يضحكون عليك."

وقد تختلف التمثيل الأساسي الفعلي بين المتصفحات (أو لا يجوز). وأود أن لا تعتمد على أي شيء آخر من الواجهة التي يتم توفيرها عند العمل معها.

ويمكنك معرفة المزيد حول صفائف جافا سكريبت على MDN .

نصائح أخرى

لإضافة إلى الإجابة tvanfosson: في ECMA-262 (مواصفات 3.0، أعتقد)، وحددت صفائف مجرد وجود هذا السلوك لتحديد خصائص (انظر 15.4.5.1). ليس هناك آلية عامة الكامنة وراء ذلك (على الأقل من الآن) - وهذا هو فقط كيف هو تعريفه، وكيف المترجمين الفوريين جافا سكريبت يجب أن تتصرف

وهذا يعتمد حقا على ما كنت تنوي القيام به.

و[].length هو "السحرية".
لم يكن في الواقع إرجاع عدد العناصر في المصفوفة. تقوم بإرجاع أكبر مؤشر نصبها في المصفوفة.

var testArr = [];  testArr[5000] = "something";  testArr.length; // 5000

ولكن الطريقة وراء واضع مخفيا في المحرك نفسه.
فإن بعض محركات في بعض المتصفحات تعطيك الوصول إلى التطبيقات الخاصة بهم من تلك الأساليب السحرية. والبعض الآخر سوف تبقي كل شيء مقفل تماما أسفل.

وحتى لا تعتمد على أساليب defineGetter وdefineSetter، أو حتى، حقا، طرق __proto__، إلا إذا كنت تعرف أي المتصفحات كنت أعلم أنك تستهدفها، والتي لم تكن.

وهذا سوف يتغير في المستقبل، حيث التطبيقات التقيد في مكتوبة باللغة المقبل ECMAScript / 6 سوف يحصلون على أكثر من ذلك.

وECMAScript المتصفحات المتوافقة 5 بدأوا بالفعل لتقديم get وset طرق سحرية في الأشياء وهناك المزيد في المستقبل ... ولكن من المحتمل أن يكون بعض الوقت بعيدا قبل أن تتمكن من تفريغ الدعم للعدو السحالي وطن من الهواتف الذكية، وهلم جرا ...

ومن المهم أن نعرف أنه عند القيام sup['look'] = 4; كنت لا تستخدم مجموعة النقابي، وإنما تعديل خصائص على سوب الكائن. وهو ما يعادل sup.look = 4; حيث يمكنك إضافة خصائص على كائنات جافا سكريبت حيوي في أي وقت. سيكون للناتج المثال 5 في المثال الأول. sup['length']

إذا كنت تنوي تنفيذ الكائنات مع وصول مثل مجموعة، و مجموعة موزيلا مركز ديف المقالة هو كبير من الموارد. للأسف أنا لا أعرف في التفاصيل عمق تنفيذ مصفوفة ولكن هناك الكثير من التفاصيل في هذا المقال.

Array الكائن يرث caller، constructor، <أ href = ل "https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Function/length" يختلط = "نوفولو noreferrer"> length ، وخصائص name من <لأ href = "HTTPS: // المطور .mozilla.org / EN / Core_JavaScript_1.5_Reference / Global_Objects / الوظيفة / نموذج "يختلط =" نوفولو noreferrer "> Function.prototype .

جافا سكريبت مجموعة هو كائن تماما مثل أي كائن آخر ، ولكن جافا سكريبت يعطيها جملة خاص.

arr[5] = "yo"

أعلاه هو نحوي السكر بالنسبة

arr.insert(5,"yo")

وهو كيف سيكون إضافة الأشياء إلى كائن منتظم.هذا ما هو داخل إدراج طريقة تغير قيمة آر.طول

انظر بلدي تنفيذ customArray اكتب هنا: http://jsfiddle.net/vfm3vkxy/4/

وكما ذكر أشخاص آخرين، وهي خاصية في جافا سكريبت يمكن أن تعمل أساسا على حد سواء كما جالبة واضعة من مجموعة (أو سلسلة أو غيرها من المدخلات).

وكما واقع الأمر، قد حاولت ذلك بنفسك:

const test=[1,2,3,4,5]
test.length = 3
console.log(test) // [1,2,3]
test.length = 5
console.log(test) // guess what happens here!

وبقدر ما أعرف، صفائف في JS لا تعمل تماما مثل صفائف النقابي ولديك العناصر التي وضعت في الذاكرة كما متاخم كما ممكن (نظرا أنه يمكن أن يكون صفائف الأجسام مختلطة)، اعتمادا على محرك JS كنت تفكر.

وكملاحظة جانبية، وأنا في حيرة قليلا أن الإجابة الأكثر صوت تبقي نشر أسطورة الإفراط في تبسيط (أو نصف الحقيقة) من "كل شيء يجري كائن في جافا سكريبت". ليست بالضبط صحيح ، وإلا فإنك سوف ندرس أبدا البدائيون، على سبيل المثال.

وتحاول أن تفعل هذا:

const pippi = "pippi"
pippi.cat = "cat"
console.log(pippi.cat) // will it work? Throw an error? Guess why again

وكابح: هو التفاف السلسلة في كائن بخس لذلك عملية محددة في السطر الثاني، ثم في واحدة بعد كنت مجرد الذهاب للوصول إلى خاصية البدائية التي لا يوجد (شريطة أن لم يلعب مع String.prototype أو ما شابه ذلك)، حتى تحصل على undefined.

خصائص جافا سكريبت مجموعة

  1. ديناميكية - المصفوفات في جافا سكريبت يمكن أن تنمو بشكل ديناميكي .دفع
  2. يمكن أن يكون متفرق مثلامجموعة[50000] = 2;
  3. يمكن أن تكون كثيفة مثلامجموعة =[1, 2, 3, 4, 5]

في جافا سكريبت ، فمن الصعب على وقت التشغيل إلى معرفة ما إذا كانت مجموعة ستكون كثيفة أو متفرق.لذلك كل ما يمكن القيام به هو اتخاذ تخمين.جميع تطبيقات استخدام ارشادي إلى تحديد ما إذا كانت مجموعة كثيفة أو متفرق.على سبيل المثال ، مدونة في النقطة 2 أعلاه ، يمكن أن تشير إلى أن وقت التشغيل جافا سكريبت أن هذا هو المرجح متفرق تنفيذ مجموعة.إذا كانت مجموعة initialised أولية العد ، وهذا يمكن أن تشير إلى أن هذا هو المرجح مجموعة كثيفة.

عند وقت التشغيل بالكشف عن أن مجموعة قليلة ، فإنه يتم تنفيذها بطريقة مماثلة إلى كائن.وذلك بدلا من الحفاظ على مجموعة متجاورة ، مفتاح/قيمة خريطة بنيت.

لمزيد من الإشارة - https://www.quora.com/How-are-javascript-arrays-implemented-internally

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