In letzter Zeit habe ich das in der Firefox-Konsole gesehen.
%Vor%Wenn ich ein Objekt wie
habe %Vor%Ich möchte einfach ein Objekt mit numerischen Tasten, auf das ich zugreifen kann, aber ich mache mir Sorgen, denn wenn es leere Slots verfolgt, muss das bedeuten, dass etwas Speicher verschwendet wird?
Sind meine Bedenken gültig und wenn ja, was wäre ein richtiger Weg, ein solches Objekt zu definieren?
Das Problem könnte daran liegen, wie Firefox ' console.log
das Eingabeobjekt interpretiert hat. Irgendwie wurde es als ein Array anstelle eines einfachen Objekts ausgewertet. Chrome macht es richtig. Wenn Sie sich genauer ansehen, wie ein Array in Javascript verwaltet wird, finden Sie Folgendes:
Arrays können keine Strings als Elementindizes (wie in einem assoziativen Array) verwenden, sondern müssen Ganzzahlen verwenden. Die Einstellung oder der Zugriff über Nicht-Ganzzahlen mithilfe der Klammernotation (oder Punktnotation) setzt oder ruft kein Element aus der Array-Liste selbst ab, sondern setzt oder greift auf eine Variable zu, die der Objekteigenschaftssammlung dieses Arrays zugeordnet ist. Die Objekteigenschaften und die Liste der Array-Elemente des Arrays sind getrennt, und die Traversierungs- und Mutationsoperationen des Arrays können nicht auf diese benannten Eigenschaften angewendet werden. src
Ein besseres Verständnis dafür besteht darin, an der length
-Eigenschaft von Array herumzubasteln. Vor allem, wenn Sie Ihr Array mit []
erstellt haben. Um Elemente zum Array hinzuzufügen, müssen wir .push(...)
verwenden. Diese Funktion verwendet die Eigenschaft length
(überprüfen Sie 15.4.4.7 Array.prototype.push
). Also kurz (interaktives Beispiel ist unten)
Sie sehen, dass die Länge jetzt 8
und nicht 4
ist. Die Indizes 3..6
sind reserviert, aber nicht definiert. Hier unten ist eine Konsolenausgabe.
Wenn Sie erneut eine .push
-Methode verwenden, wird das neue Element nach dem '7thEl'
-Element (so auf Index 8) platziert.
Um die Schlüssel zu überprüfen, die von diesem Objekt verwendet werden, können wir Object.keys()
für das Array. Du bekommst
Sie sehen, dass numerische Werte als Schlüssel verwendet werden. Wie dein Objekt, das ist
%Vor% Die Verwendung von Object.keys
für dieses Objekt ergibt ["6", "10"]
. Es hat eine ähnliche Ausgabe wie oben. Das console.log
from firefox interpretiert Ihr Objekt als Array und zeigt es als Array an. Um das Array korrekt anzuzeigen, startet es (logisch gesehen, muss noch den Quellcode überprüfen) am Schlüssel 0
und endet am Schlüssel array.length - 1
. Die Indizes 0,1..5
und 7..9
sind jedoch nicht "definiert". Also führt es zu diesem Ausgang
Ich bin mir nicht sicher, ob ich dies als Fehler oder Fehler in der Firefox-Konsolen-API qualifizieren muss ... Oder dass die Konsoleneingabe (beim Initialisieren einer Variablen) das Objekt falsch gelesen hat.
--- Live-Beispiel -
Javascript verwendet Sparse-Arrays. "Da sich die Länge eines Arrays jederzeit ändern kann und Daten an nicht zusammenhängenden Stellen im Array gespeichert werden können, sind JavaScript-Arrays nicht garantiert dicht. Dies hängt davon ab, wie der Programmierer sie verwendet." ( Quelle )
Wenn die Objekte vom Typ Array
sind, dann ist der verwendete Speicher ein Implementierungsdetail der Engine. In Ihrem Fall sind die Objekte object
s, sodass nur der Speicher für das Objekt selbst und die Eigenschaftsnamen und Verweise auf Eigenschaftswerte gespeichert werden.
Tags und Links javascript