Warum wird die JavaScript For ... In-Schleife nicht für Arrays empfohlen? [Duplikat]

8

Ich habe irgendwo gelesen (sorry, ich kann den Link nicht finden), dass die For ... In-Schleife nicht für Arrays empfohlen wird. Es wird hier gesagt: Ссылка , dass es für assoziative Arrays gedacht ist, und in Ссылка , das zum Durchlaufen aller Eigenschaften eines Objekts dient (es besagt nicht, dass es für Arrays verwendet werden kann). Ich weiß nicht, wem ich glauben soll. Ich möchte nicht, dass diese Frage zu einer Debatte wird. Ich möchte nur wissen, ob ich das in meinem Code ohne unvorhergesehene Nebenwirkungen verwenden könnte. Danke!

    
Jairo 11.03.2011, 06:35
quelle

4 Antworten

17

Ein Array ist ein Objekt, und Array-Elemente sind einfach Eigenschaften, bei denen der numerische Index in eine Zeichenfolge konvertiert wird. Zum Beispiel verweist arr [123] auf eine Eigenschaft "123" im array-Objekt arr.

Das for ... in -Konstrukt funktioniert bei allen -Objekten , nicht nur bei Arrays, und das verursacht Verwirrung.

Wenn jemand for ... in ein Array ist, beabsichtigt der Programmierer vor allem nur alle Elemente zu durchlaufen, am wahrscheinlichsten in der Reihenfolge . Wenn das Array beispielsweise eine Menge von Zahlen enthält, beabsichtigt der Programmierer höchstwahrscheinlich, einen Strom von Zahlen zu iterieren. Die Semantik ist der Array-Iteration in anderen Programmiersprachen so ähnlich, dass es sehr leicht ist, sie zu verwirren.

In JavaScript führt dieses Konstrukt keine Array-Elemente in der Reihenfolge durch. Es iteriert alle Eigenschaftsnamen des Arrays (einschließlich der Namen von ererbten Prototypfunktionen, hinzugefügter Eigenschaften, anderer hinzugefügter Nicht-Elementeigenschaften usw.) und nicht in der Reihenfolge at alles . In früheren Browsern wird es sogar die Eigenschaft length finden, obwohl in neueren Browsern diese Eigenschaften jetzt aus genau diesem Grund versteckt sind - Leute stolpern immer darauf!

Mit dem obigen Array von Ganzzahlen erhalten Sie keinen Zahlenstrom, sondern einen Strom von Textzeichenfolgen. Und nicht die Elementwerte, sondern die Namen der Eigenschaften (die nur die numerischen Indizes sind, die nicht in einer Reihenfolge sind). Dies ist sehr wahrscheinlich nicht was der Programmierer meint, wenn er / sie aus einer anderen Programmiersprache kommt. Wenn die Elemente, die in dem Array gespeichert sind, ähnliche numerische Werte haben, verwirren sie die Hölle von allen.

Deshalb sollten Sie es nicht tun. Sie sollten kein Sprachkonstrukt verwenden, das scheinbar offensichtliche Dinge tut, sondern Dinge tut, die völlig verschieden sind. Es erzeugt Fehler, die sehr unklar und sehr schwer zu finden sind.

    
Stephen Chung 11.03.2011, 06:57
quelle
2

Ich habe Array Iteration in mehreren Browsern getestet (FireFox 3, Opera 9, IE6, IE9 Beta, Chrome) und es funktioniert gut; Ich erinnere mich an eine browserübergreifende Inkompatibilität, aber ich muss mich irren.

Es gibt jedoch immer noch einen Vorbehalt:

Wie Sie bereits erwähnt haben, wird die Syntax for ... in verwendet, um die Eigenschaften eines Objekts zu durchlaufen. Bei einem Array werden also alle Eigenschaften dieses Array-Objekts zusammen mit den Elementen durchlaufen. Normalerweise weist das Array-Objekt nur Eigenschaften auf, die den Schlüsseln entsprechen. Wenn jedoch ein anderes Skript Array.prototype (z. B. ein Framework) ändert, werden die hinzugefügten Methoden / Attribute in der Iteration ebenfalls unerwartet angezeigt.

    
Cameron 11.03.2011 06:40
quelle
2

In der Bibliotheksdokumentation von Prototype.js finden Sie einige gute Gründe: Ссылка

Grundsätzlich ist die Verwendung von for ... in, um ein Array zu iterieren, spröde, da jeder andere Code dem Array-Prototyp Eigenschaften hinzufügen kann, die dann auf jedem Array-Objekt zu aufzählbaren Eigenschaften werden.

    
Mark Bessey 11.03.2011 07:09
quelle
0

Wenn Sie mit for(... in ...) über ein Array iterieren, erhalten Sie keine numerischen Schlüssel, sondern erhalten String-Werte.

Damit werden die Eigenschaften für den Prototyp definiert. Wenn also ein Code Array erweitert, z. indem Sie:

%Vor%

Dann sehen Sie die Eigenschaft each .

Es gibt keine Garantie, dass Sie die Eigenschaften in Array-Indexreihenfolge erhalten. Z.B. versuche, über

zu iterieren %Vor%

Bei vielen Browsern erhalten Sie 1 vor 0 .

Und Sie können nicht garantiert alle Indizes erhalten. Versuchen Sie, über

zu iterieren %Vor%

Sie erhalten nicht den Index 1 oder 2 .

    
Mike Samuel 11.03.2011 07:18
quelle

Tags und Links