Das Beispiel in diesem Artikel beschreibt die Verwendung der Push-Methode in einem Javascript-Array. Teilen Sie es als Referenz mit allen. Die Details lauten wie folgt:
Sehen Sie sich den folgenden Code an:
var o = { 1:'a' ,2:'b' ,length:2 ,push:Array.prototype.push }; o.push('c');
F:o Wie sieht der interne Wert nun aus?
Meine erste Reaktion war Ablehnung. Warum sollte ich das Verhalten der [Erklärungsmaschine] unter unzumutbaren Umständen untersuchen? Aber diese Art der Schlussfolgerung ist manchmal sehr attraktiv. Als ich zurückkam, dachte ich sorgfältig darüber nach und stellte fest, dass sie eigentlich sehr einfach ist.
Für die Push-Methode denke ich reflexartig an den Stapel [Klassischer Stapel von Datenstrukturen] Die Stapel-Push- und Pop-Operationen basieren auf dem oberen Zeiger des Stapels Dies bedeutet, dass er sich durch das Herunterdrücken des Stapels automatisch vergrößert oder verkleinert. Im Array in JavaScript ist dieser Zeiger die Länge. Im obigen Code ist o.push('c') also o.2 = 'c' (natürlich kann nicht direkt auf o.2 zugegriffen werden, dies ist nur Pseudocode), also die Daten in o, nachdem der Code ausgeführt wurde lautet wie folgt:
{ 1:'a' ,2:'c' ,length:3 //push操作=>length+1 ,push:Array.prototype.push }
Zusätzliche Erklärung:
In JavaScript ist alles ein Objekt und es gibt einige Unterschiede zwischen JavaScript-Objekten und stark typisierte Objekte. Verstehen Sie, dass ein Erfolg eine Sammlung von Schlüssel-Wert-Paaren ist. Der Array-Typ ist keine Ausnahme. Sein Indexzugriff ist ein Schlüsselzugriff (aber seine Schlüssel sind alle natürliche Zahlen) und simuliert tatsächlich ein Array (ein Index, der bei 1 Array beginnt). Es gibt nur einige Merkmale von Arrays. Wenn beispielsweise über einen Schlüssel auf ein echtes Array zugegriffen wird, führt es eine Überprüfung auf außerhalb der Grenzen liegende Länge durch.
Solange man weiß, dass die Schubposition auf der Länge basiert, sind die folgenden scheinbar seltsamen Phänomene leicht zu verstehen:
//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,...}我还以为js解释器会把A转换成ASCII码来给length赋值呢,终于看到了javascript的自由还是有节操的
Numerische Werte werden in Computern im Zweierkomplementformat gespeichert. Um Operationen zu erleichtern, ist das Komplement von -1 dasselbe wie das Komplement von 4294967295. Gemäß der Längensemantik ist hier die vorzeichenlose Zahl
[-1] Ergänzung = 1111 1111 1111 1111 1111 1111 1111 1111 = [4294967295] Ergänzung = 1111 1111 1111 1111 1111 1111 1111 1111
Also drücken wir o in Paar 2 Objekt, das Der Schlüssel ist 4294967296. die maximale Länge des Arrays ist auf 4294967296 begrenzt, was bedeutet, dass der Index nur bis 4294967295 genommen werden kann und nur 32 Bits belegt werden – für 4294967296 = 1 0000 0000 0000 0000 0000 0000 0000 0000, nach der Übernahme der letzten 32 Bits, es wird 0, also ist die Position dieses Pushs 0.