In Javascript definiere ich ein Array wie dieses
var arr = [1,2,3];
auch ich kann tun
arr[-1] = 4;
Wenn ich es jetzt tue
arr = undefined;
Ich verliere auch den Verweis auf den Wert bei arr [-1] .
Für mich scheint es logischerweise so, als ob arr [-1] auch ein Teil von arr ist .
Aber wenn ich folge (ohne arr auf undefined zu setzen)
arr.length;
Es gibt 3 nicht 4 ;
Mein Punkt ist also, wenn die Arrays mit negativen Indizes verwendet werden können, sollten diese negativen Indizes auch Teil ihrer Länge sein **. Ich weiß nicht, ob ich falsch liege oder ob mir ein Konzept über Arrays fehlt.
javascript
arrays
me_digvijay
quelle
quelle
arr[1.5] = 1
und das hat auch keinen Einfluss auf die Länge. Die Sprachspezifikation ist sehr klar darüber, was die Länge beeinflusst. Sie mögen es vielleicht nicht, aber Sie müssen damit leben. Entweder das oder Sie entwerfen Ihre eigene Konkurrenzsprache und überzeugen die Leute, darauf umzusteigen.var a = []; a['foo'] = 'baz'
bedeutet jedoch nicht, dass Sie dies tun sollten. es ist eindeutig gegen alle Konventionen.Antworten:
Ja, aber nicht so, wie Sie denken.
Sie können einem Array beliebige Eigenschaften zuweisen (genau wie jedes andere Objekt in JavaScript). Dies tun Sie, wenn Sie das Array bei "indizieren"
-1
und einen Wert zuweisen. Da dies kein Mitglied des Arrays und nur eine beliebige Eigenschaft ist, sollten Sie nicht erwartenlength
, diese Eigenschaft zu berücksichtigen.Mit anderen Worten, der folgende Code macht dasselbe:
quelle
length
Eigenschaft.for
Schleife von0
bis ausgeführt wird.length
. Tunconsole.dir(arr)
, um das gesamte Objekt zu sehen. Die Verwendung der Klammernotation für den Zugriff auf Arrays ist kein Merkmal von Arrays, sondern ein inhärentes Merkmal von Objekten (var obj = {foo: 'bar'}; obj.foo or obj['foo']
).Die
length
Eigenschaft gibt eine Nummer eins zurück, die höher als der höchste zugewiesene "Index" ist, wobei Array- "Indizes" Ganzzahlen größer oder gleich Null sind. Beachten Sie, dass JS "spärliche" Arrays zulässt:Wenn es natürlich keine Elemente dann
length
ist0
. Beachten Sie auch, dass daslength
nicht aktualisiert wird, wenn Siedelete
das höchste Element entfernen.Arrays sind jedoch Objekte, sodass Sie Eigenschaften mit anderen beliebigen Eigenschaftsnamen einschließlich negativer Zahlen oder Brüche zuweisen können:
Beachten Sie, dass JS hinter den Kulissen die Eigenschaftsnamen in Zeichenfolgen konvertiert, auch wenn Sie eine Zahl wie angeben
-1
. (Die positiven Ganzzahlindizes werden auch zu Zeichenfolgen.)Array Methoden, wie
.pop()
,.slice()
etc., nur die Arbeit an den Null-oder-höhere ganzen Zahl „Indizes“, nicht auf anderen Eigenschaften, solength
ist konsistent zu diesem Punkt.quelle
var a = new Array(9)
,a
hat eine Länge von 9 und überhaupt keine Elemente.Array.slice()
Methode soll das tun. DieString.slice()
Methode macht das Gleiche.Beachten Sie, dass bei Verwendung eines Positionsindex (oder 0-Index) Werte innerhalb des Arrays platziert werden:
Dies ist nicht der Fall, wenn Sie Nicht-Index-Werte hinzufügen (nicht 0-9 +):
Werte werden nur dann in das Array eingefügt, wenn Sie die Regeln einhalten. Wenn Sie dies nicht tun, werden sie nicht akzeptiert. Sie werden jedoch für das Array-Objekt selbst akzeptiert, was bei fast allem in JavaScript der Fall ist. Obwohl dies
["Foo", "Bar"]
die einzigen Werte in unserem Array sind, können wir dennoch auf Folgendes zugreifen"Fizzbuzz"
:Beachten Sie jedoch erneut, dass dies nicht Teil der Array-Werte ist, da der "Index" nicht gültig ist. Es wurde stattdessen als weiteres Mitglied zum Array hinzugefügt. Wir könnten auf die gleiche Weise auf andere Array-Mitglieder zugreifen:
Beachten Sie hier, dass wir auf die
pop
Methode im Array zugreifen , die uns darüber informiert, dass diese systemeigenen Code enthält. Wir greifen nicht mit dem Schlüssel "pop" auf einen der Array-Werte zu, sondern auf ein Mitglied des Array-Objekts. Wir können dies weiter bestätigen, indem wir über die öffentlichen Mitglieder des Objekts fahren:Was Folgendes ausspuckt:
Also noch einmal, es ist auf dem Objekt , aber es ist nicht in dem Array .
Tolle Frage! Hat mich dazu gebracht, sicher ein Double-Take zu machen.
quelle
["Foo", "Bar"]
aber hier Geige["Foo", "Bar", -1: "Fizzbuzz"]
prüfen . Wie Sie geschrieben haben, wird es eine Eigenschaft mit dem Schlüssel -1, aber es ist definitiv in der Ausgabe sichtbar. Ansonsten ist Ihre Antwort nett und vollständig. Wenn Sie sich ändern, werde ich erneut upvoten, mein downvote war zu hart, kann es aber nicht entfernen; Zeit abgelaufen.Wenn Sie wirklich möchten, dass negative Indizes und andere Indizes in die Länge aufgenommen werden, erstellen Sie die Funktionalität selbst:
Dann zum Beispiel:
quelle
if(Number(key) != NaN) length++;
Wenn Sie die float- Anweisungen herausfiltern möchten, fügen Sie&& key % 1 == 0
sie der Bedingung hinzuArrays in JavaScript sind eigentlich Objekte. Sie werden einfach vom Array-Konstruktor als Prototyp erstellt.
Array-Indizes sind tatsächlich Schlüssel in einer Hashmap, und alle Schlüssel werden in Zeichenfolgen konvertiert. Sie können einen beliebigen Schlüssel erstellen (dh "-1"), aber die Methoden in Array sind so angepasst, dass sie sich wie ein Array verhalten. Es
length
ist also nicht die Größe des Objekts, sondern nur garantiert größer als der größte ganzzahlige Index. In ähnlicher Weise werden beim Druckenarr
nur Werte mit Ganzzahlschlüsseln> = 0 aufgelistet.Mehr Infos hier.
quelle
Array ist nur eine spezielle Art von Objekt in JS. Es gibt eine spezielle Syntax, die gut ist, weil sie es uns ermöglicht, effektiv mit ihnen zu arbeiten. Stellen Sie sich vor, wie mühsam es wäre, ein Array-Literal so zu schreiben:
Es gibt aber trotzdem Objekte . Wenn Sie dies tun:
Diese nicht ganzzahligen Eigenschaften werden an ein Objekt angehängt (welches Array ist), aber einige native Methoden wie z
Array.length
.Sie können davon ausgehen, dass die native 'Längen'-Methode ein Getter ist, der alle Eigenschaften zählt (und Indizes sind Eigenschaften, während Werte die tatsächlichen Werte sind ), die in eine positive Ganzzahl oder Null konvertierbar sind. So etwas wie diese Pseudo-Implementierung:Aufgrund von Spezifikationen überprüft die native
lenght
Methode - als getter (exampleArray.length
) - alle 'nichtnegativen Ganzzahlen kleiner als 2 32 ' Schlüssel, holt die große Eins und gibt ihren numerischen Wert + 1 zurück.Als Setter (
exampleArray.length = 42
) werden entweder einige leere Slots für 'fehlende' Indizes erstellt, wenn die angegebene Länge größer als die tatsächliche Anzahl nichtnegativer Ganzzahlschlüssel ist, oder alle nichtnegativen Ganzzahlschlüssel (und ihre Werte) gelöscht, die nicht größer als die sind gegebene Länge.Die Pseudo-Implementierung:
quelle
Laut MDN:
In Javascript können Sie eine Eigenschaft für jedes von Ihnen erstellte Objekt festlegen.
Auf die gleiche Weise wird beim Festlegen eines negativen Index dieser als Eigenschaft im Array und nicht als Teil des Index gespeichert.
Aus diesem Grund spiegelt die Länge sie nicht wider, aber eine for..in-Schleife zeigt sie an.
quelle
Wenn Sie nicht positive oder nicht numerische Indizes verwenden, verhält sich das Array wie ein assoziatives Array mit Schlüssel-Wert-Paaren.
Zum Durchlaufen des Arrays können Sie verwenden
quelle