/ / Warum die Verwendung von pop () in einer for-Schleife nicht funktioniert (Javascript) - Javascript, Arrays, Indizierung, Pop

Warum funktioniert pop () innerhalb einer for-Schleife nicht (Javascript) - Javascript, Arrays, Indizierung, Pop

Ich habe mich gefragt, ob es an der pop () - Funktion von javaScript etwas Besonderes gibt, über das ich Bescheid wissen sollte.

Meine Absicht war es, ein Programm zu schreiben, das alle Werte in einem Array löscht, ohne das Array tatsächlich zu löschen. Mein erster Versuch war dies, was nicht genau geklappt hat:

var index = [1,2,3,4,5,6,7,8,9,10];

for(var i=0;i<index.length;i++) { index.pop(); console.log(index+";"); }

// outputs this:

[1,2,3,4,5,6,7,8,9];
[1,2,3,4,5,6,7,8];
[1,2,3,4,5,6,7];
[1,2,3,4,5,6];
[1,2,3,4,5];

Und dann hört es einfach dort auf. Huh? Bei der Überprüfung stellte ich fest, dass das Array wirklich war [1,2,3,4,5]und nicht irgendein console.log-Anzeigefehler. Was keinen Sinn ergab.

Aus gutem Grund habe ich mich entschlossen, die for-Schleife zu dekrementieren und wie folgt zu verwenden:

var index = [1,2,3,4,5,6,7,8,9,10];

for(var i=index.length; i--; i>0) { index.pop(); console.log(index+";"); }

// and for some reason, this works:

[1,2,3,4,5,6,7,8,9];
[1,2,3,4,5,6,7,8];
[1,2,3,4,5,6,7];
[1,2,3,4,5,6];
[1,2,3,4,5];
[1,2,3,4];
[1,2,3];
[1,2];
[1];
[];

Warum funktioniert das zweite Beispiel und nicht das erste? Scheint mir ziemlich seltsam. (Ich knirsche mit den Zähnen, wie lächerlich JavaScript manchmal ist) !!!

Vielen Dank!

EDIT: Ich wusste nicht, dass die for-Schleife jedes Mal nach index.length sucht, nicht nur beim ersten Aufruf.

Antworten:

1 für die Antwort № 1

Das Problem ist, dass Ihre erste for-Schleife die index.length betrachtet. Es ändert sich ständig, weil das Array immer kleiner wird! Nach fünf Schleifen lautet Ihr Array also:

[1,2,3,4,5];

und i ist 5, weil dies die fünfte Schleife ist. Also der Zustand i<index.length kommt raus zu 5<5, was falsch ist. Beachten Sie, dass die index.length ist nur "5"! Wir haben das Array verkürzt! Also verlassen Sie die Schleife. Wenn Sie möchten, dass es funktioniert, müssen Sie die ursprüngliche Länge in einer Variablen speichern, damit sie sich nicht bei jeder Iteration ändert:

var original_length = index.length;
for(var i=0;i<original_length;i++) { index.pop(); console.log(index+";"); }

0 für die Antwort № 2

Wenn Sie ein Element aus dem Array entfernen, verringert sich die Länge des Arrays. Sie haben also fünf Elemente aus dem Array entfernt index.length ist fünf und i ist fünf, daher schlägt die Schleifenbedingung fehl.
Bei der zweiten Schleife überprüfen Sie erst zu Beginn die Länge des Arrays, bevor Sie Elemente daraus entfernen.


0 für die Antwort № 3

Nur um die Kommentare zu ergänzen und mit einem Beispiel zu beantworten.

var l = index.length
for(var i=0;i<l;i++) { index.pop(); console.log(index+";"); }