English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

تحليل استخدام طريقة push في قائمة JavaScript

本文实例讲述了Javascript数组中push方法用法。分享给大家供大家参考,具体如下:

看下面代码:

var o = {
  1:'a'
  ,2:'b'
  ,length:2
  ,push:Array.prototype.push
;
o.push('c');

Q: o现在内部的值是什么样子?

كان رد فعلي الأول هو الرفض،لماذا نحتاج إلى دراسة سلوك المحرك في الحالات غير العادية؟ ولكن في بعض الأحيان تكون هذه الاستنتاجات جذابة،وقد عدت وأفكرت بعناية،ووجدت أن هذا بسيط جدًا.

بالنسبة لطريقة push، فكرت في أول الأمر في أنها مثل الدليل،[التصنيف الكلاسيكي للدليل]،عمل الدليل والإزالة بناءً على مؤشر الرأس،ويكون مؤشر الرأس دائمًا يتجه إلى القمة، مما يعني أنه سيزيد أو ينقص تلقائيًا عند الدليل والإزالة. في array جافا سكريبت، هذا المؤشر هو length. لذا،في الكود السابق،o.push('c') هو o.2 = 'c'(بالطبع لا يمكن الوصول إلى o.2 مباشرة،هذا مجرد رمز وهمي)،لذا يصبح البيانات في o بعد تنفيذ الكود كالتالي:

{
  1:'a'
  ,2:'c'
  ,length:3 //تحديث push=>length+1
  ,push:Array.prototype.push
}

إضافة إلى ذلك:

في جافا سكريبت، كل شيء هو عنصر، وقد تكون جافا سكريبت مختلفة عن العناصر القوية، يمكن فهمها كجمع من مجموعات المفاتيح القيم. لا تختلف نوعًا ما عن نوع array، حيث يتم الوصول إلى العنصر عبر المفتاح (لكن المفاتيح لديها أرقام طبيعية)، وفي المثال السابق، تم تعيين قيمة المفتاح a كواقعي لتحليله كعدد (بالطبع ليس عددًا حقيقيًا، بل مجرد رمز)، وهو ما يمثل نموذجًا من النوع array (عدد بدء من 1) - بالطبع ليس لديه جميع خصائص array الحقيقي، مثل التحقق من الحدود عند الوصول إلى المفتاح.

بمجرد معرفة أن موقع push يعتمد على length، يمكن فهم جميع الظواهر الغريبة التي تظهر:

//1.length غير موجودة، يتم تعيينها إلى 0 من قبل المحرك
var o = {
  '1':'a'
  '2':'b'
  ,push:Array.prototype.push
;
o.push('c');//c {0:'c',1:'a',2:'b',...}
//2.length هو قيمة سالبة، هذا هو سؤال مثير للاهتمام، يتعلق بالمقابل الأصلي والمعكوس والمضاد[1]
var o = {
  '1':'a'
  '2':'b'
  ,length:-1
  ,push:Array.prototype.push
;
o.push('c');//c {1:'a',2:'b',4294967295:'c',length:4294967296,...}
//3.length هو نص أو عنصر
var o = {
  1:'a'
  ,2:'b'
  ,length:'A'
  ,push:Array.prototype.push
;
o.push('c');//c {0:'c',1:'a',2:'b',length:1,...} ظننت أن معالج جافا سكريبت سيقوم بتحويل A إلى رمز ASCII لتحديد length، وكنت سعيدًا برؤية حرية جافا سكريبت بروح النزاهة

كل القيم العددية في الحاسوب يتم تخزينها بالطريقة المضادة، وبهدف سهولة الحسابات، يتم معالجة مُضاد -1 ومضاد 4294967295 بنفس الطريقة، وفقًا للمعنى من length، هنا العدد غير الموقع

[-1] ملاحظة = 1111 1111 1111 1111 1111 1111 1111 1111 = [4294967295] ملاحظة = 1111 1111 1111 1111 1111 1111 1111 1111

لذا، نحن نضيف إلى o في 2، حيث يتم أخذ المفتاح كـ 4294967296، ولكن الحد الأقصى لطول الصف هو 4294967296، مما يعني أن المفتاح يمكن أن يكون فقط 4294967295، أي أنه يمكن أن يكون فقط 32ًا من الأرقام العشرية - عند أخذ 32 من الأرقام العشرية من 4294967296 = 1 0000 0000 0000 0000 0000 0000 0000 0000، يصبح 0، لذا فإن موقع الإدراج هذا هو 0.

يمكن للقراء المهتمين بمعرفة المزيد عن JavaScript التحقق من المقالات الخاصة بالموقع: 'تجميع تقنيات معالجة قائمة JavaScript'، 'تجميع تقنيات التدوير والتعامل مع قائمة JavaScript'، 'تجميع استخدامات العمليات الحسابية في JavaScript'، 'تجميع تقنيات بنية البيانات والخوارزميات في JavaScript'، 'تجميع تقنيات التأثيرات التفاعلية والتعامل معها في JavaScript'، 'تجميع تقنيات البحث في JavaScript'، 'تجميع تقنيات الأنيمات والمؤثرات في JavaScript'، و 'تجميع تقنيات التعامل مع الأخطاء والتحقق من صحة البرامج في JavaScript'.

آمل أن يساعدك هذا المقال في تصميم برامج JavaScript الخاصة بك.

إعلان: محتويات هذا المقال تم جمعها من الإنترنت، ملكية المحتويات لصاحب الحقوق، تم جمع المحتويات من قبل مستخدمي الإنترنت بشكل تلقائي، هذا الموقع لا يمتلك حقوق الملكية، لم يتم تعديل المحتويات بشكل إنساني، ولا يتحمل أي مسؤولية قانونية مرتبطة بذلك. إذا وجدت محتوى يشتبه في انتهاك حقوق النسخ، فلا تتردد في إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (عند إرسال البريد الإلكتروني، يرجى استبدال '#' بـ '@') لتقديم الشكوى، وتقديم الدليل المتعلق، إذا تم التحقق من صحة الشكوى، فإن هذا الموقع سيقوم بإزالة المحتوى المزعوم بسرعة.

تخمينك المفضل