Ich weiß, was eine for... in
Schleife ist (sie iteriert über den Schlüssel), habe aber beim ersten Mal davon gehört for... of
(sie iteriert über den Wert).
Ich bin mit for... of
Schleife verwechselt . Ich habe kein Adjektiv bekommen. Dies ist der folgende Code:
var arr = [3, 5, 7];
arr.foo = "hello";
for (var i in arr) {
console.log(i); // logs "0", "1", "2", "foo"
}
for (var i of arr) {
console.log(i); // logs "3", "5", "7"
// it is does not log "3", "5", "7", "hello"
}
Was ich habe, ist, for... of
iteriert über Eigenschaftswerte. Warum loggt es nicht (zurück) "3", "5", "7", "hello"
statt "3", "5", "7"
? Die for... in
Schleife durchläuft jedoch jede Taste ( "0", "1", "2", "foo"
). Hier for... in
iteriert die Schleife auch über den foo
Schlüssel. Aber for... of
iteriert nicht über den Wert von foo
Eigentum dh "hello"
. Warum ist es so?
Lange Rede, kurzer Sinn:
Hier tröste ich for... of
Schleife. Es sollte sich protokollieren, "3", "5", "7","hello"
aber hier wird es protokolliert "3", "5", "7"
. Warum ?
quelle
for ... of
wurde es in die Sprache gebracht, um die Probleme bei der Verwendungfor ... in
mit Arrays zu beheben .Array.prototype
könnte so geändert werden, dass zusätzliche Eigenschaften verfügbar sind, was es unsicher macht, sie zu wiederholen, da Sie möglicherweise nicht numerische Schlüssel erhalten, die Sie nicht erwartet haben.of
Schlüsselworts (für… von Schleifen) , da es nach einem bestimmten Verhalten der Funktion fragt, anstatt nach einer allgemeinen Übersicht zu fragen.for <key> in
for <value> of
for..of
Antworten:
for in
Schleifen über aufzählbare Eigenschaftsnamen eines Objekts.for of
(neu in ES6) verwendet einen objektspezifischen Iterator und durchläuft die dadurch generierten Werte.In Ihrem Beispiel liefert der Array-Iterator alle Werte im Array (ohne Berücksichtigung von Nicht-Index-Eigenschaften).
quelle
for ... of
ist in ES6 standardisiert.for... of
:: Arrays :: Arrays haben immer eine Länge, so dass Sie denken könnenfor..
[n-te Element]of..
[q Elemente]for..in..keys
=== Fremdschlüssel ===for...in
für Schlüssel verwenden! Verwenden Sie daherfor...of
für Werte.Eine vollständige Antwort finde ich unter: https://www.typescriptlang.org/docs/handbook/iterators-and-generators.html (Obwohl es sich um ein Typenskript handelt, gilt dies auch für Javascript.)
quelle
index
. Und dann für "von" wäre dasvalues
von jedem Index / Schlüssel / Gegenstand.let thisItem = items[all];
Variable zu erstellen ,for...of
hilft dabei, dies zu verknüpfen!for...in
wieObject.keys()
, weißt du was? Arrays sind Objekte, die auch ihre Unabhängigkeiten zurückgeben würden. :)Für ... in Schleife
Die for ... in- Schleife verbessert die Schwächen der for-Schleife, indem die Zähllogik und die Ausgangsbedingung beseitigt werden.
Beispiel:
Sie müssen sich jedoch noch mit dem Problem befassen, einen Index zu verwenden, um auf die Werte des Arrays zuzugreifen, und das stinkt. es macht es fast verwirrender als zuvor.
Außerdem kann die for ... in-Schleife Sie in große Schwierigkeiten bringen, wenn Sie einem Array (oder einem anderen Objekt) eine zusätzliche Methode hinzufügen müssen. Da für ... in Schleifen alle aufzählbaren Eigenschaften durchlaufen, bedeutet dies, dass diese Eigenschaften auch in der Schleife angezeigt werden, wenn Sie dem Prototyp des Arrays zusätzliche Eigenschaften hinzufügen.
Drucke:
Aus diesem Grund wird davon abgeraten, for ... in-Schleifen beim Durchlaufen von Arrays zu verwenden.
Für ... der Schleife
Die for ... of- Schleife wird verwendet, um alle Arten von Daten zu durchlaufen, die iterierbar sind.
Beispiel:
Drucke:
Dies macht die for ... of-Schleife zur prägnantesten Version aller for-Schleifen.
Aber warte, da ist noch mehr! Die for ... of-Schleife hat auch einige zusätzliche Vorteile, die die Schwächen der for und for ... in Schleifen beheben.
Sie können eine for ... -Schleife jederzeit stoppen oder unterbrechen.
Drucke:
Und Sie müssen sich keine Gedanken über das Hinzufügen neuer Eigenschaften zu Objekten machen. Die for ... of-Schleife durchläuft nur die Werte im Objekt.
quelle
for (var index=0; index<arr.length; index++)
Schleife (wobei derindex
Zähler im Gegensatz zu Ihrem Beispiel eine ganze Zahl ist).Unterschied
for..in
undfor..of
:Beide
for..in
undfor..of
sind Schleifenkonstrukte, die zum Iterieren über Datenstrukturen verwendet werden. Der einzige Unterschied besteht darin, was sie wiederholen:for..in
iteriert über alle aufzählbaren Eigenschaftsschlüssel eines Objektsfor..of
iteriert über die Werte eines iterierbaren Objekts. Beispiele für iterierbare Objekte sind Arrays, Strings und NodeLists.Beispiel:
In diesem Beispiel können wir beobachten, dass die
for..in
Schleife über die Schlüssel des Objekts iteriert, das in diesem Beispiel ein Array-Objekt ist. Die Schlüssel sind 0, 1, 2, die den hinzugefügten Array-Elementen und entsprechenaddedProp
. So sieht dasarr
Array-Objekt in Chrome Devtools aus:Sie sehen, dass unsere
for..in
Schleife nichts weiter tut, als einfach über diese Werte zu iterieren.Die
for..of
Schleife in unserem Beispiel durchläuft die Werte einer Datenstruktur. Die Werte in diesem speziellen Beispiel sind'el1', 'el2', 'el3'
. Die Werte, die eine iterierbare Datenstruktur zurückgibt,for..of
hängen vom Typ des iterierbaren Objekts ab. Beispielsweise gibt ein Array die Werte aller Array-Elemente zurück, während eine Zeichenfolge jedes einzelne Zeichen der Zeichenfolge zurückgibt.quelle
Die
for...in
Anweisung durchläuft die aufzählbaren Eigenschaften eines Objekts in beliebiger Reihenfolge. Aufzählbare Eigenschaften sind jene Eigenschaften, deren internes [[Aufzählbar]] - Flag auf true gesetzt ist. Wenn also eine aufzählbare Eigenschaft in der Prototypkette vorhanden ist, wird diefor...in
Schleife auch diese durchlaufen.Die
for...of
Anweisung iteriert über Daten, über die das iterierbare Objekt definiert werden soll.Beispiel:
Wie zuvor können Sie das Hinzufügen
hasOwnProperty
vonfor...of
Schleifen überspringen .quelle
Die for-in-Anweisung durchläuft die aufzählbaren Eigenschaften eines Objekts in beliebiger Reihenfolge.
Die Schleife durchläuft alle aufzählbaren Eigenschaften des Objekts selbst und die Eigenschaften, die das Objekt vom Prototyp seines Konstruktors erbt
Sie können sich vorstellen, dass "for in" im Grunde genommen alle Schlüssel iteriert und auflistet.
quelle
for in
zeigt die Schlüssel nur an, wenn sie von uns hinzugefügt wurden, es wird nicht formatUnicornString.prototype
.Es gibt einige bereits definierte Datentypen, mit denen wir sie leicht durchlaufen können, z. B. Array-, Map- und String-Objekte
Normal für in Iterationen über den Iterator und als Antwort liefert uns die Schlüssel, die in der Reihenfolge der Einfügung sind, wie im folgenden Beispiel gezeigt.
Wenn wir nun dasselbe mit for of versuchen , liefert es uns als Antwort die Werte, nicht die Schlüssel. z.B
Wenn wir uns also beide Iteratoren ansehen, können wir den Unterschied zwischen beiden leicht unterscheiden.
Wenn wir also versuchen, über ein normales Objekt zu iterieren, erhalten wir einen Fehler, z.
Zum Durchlaufen müssen wir nun einen ES6 Symbol.iterator definieren, z
Dies ist der Unterschied zwischen For in und For of . Hoffe, dass es den Unterschied klären könnte.
quelle
Ein weiterer Unterschied zwischen den beiden Schleifen, den noch niemand erwähnt hat:
Quelle
Wenn wir also die Destrukturierung in einer Schleife verwenden möchten , um sowohl den Index als auch den Wert jedes Array- Elements zu erhalten, sollten wir die
for...of
Schleife mit der Array- Methode verwendenentries()
:quelle
for each...in
veraltet ist (erster Punkt), aber ich habe nicht darüber geschrieben ... Ich schrieb, dass "Destrukturierungfor...in
veraltet ist. Verwenden Siefor...of
stattdessen." (zweiter Punkt): developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… Stimmen Sie mir zu @GalMargalit?Alle haben erklärt, warum dieses Problem auftritt, aber es ist immer noch sehr leicht, es zu vergessen und sich dann am Kopf zu kratzen, warum Sie falsche Ergebnisse erzielt haben. Besonders wenn Sie an großen Datenmengen arbeiten, wenn die Ergebnisse auf den ersten Blick in Ordnung zu sein scheinen.
Mit stellen
Object.entries
Sie sicher, dass Sie alle Eigenschaften durchlaufen:quelle
Ich sehe viele gute Antworten, aber ich entscheide mich, meine 5 Cent zu setzen, nur um ein gutes Beispiel zu haben:
Für in Schleife
iteriert über alle aufzählbaren Requisiten
Für von Schleife
iteriert über alle iterierbaren Werte
quelle
Als ich anfing, die for in- und of-Schleife zu lernen , war ich auch mit meiner Ausgabe verwirrt, aber mit ein paar Recherchen und Verständnis kann man sich die einzelne Schleife wie folgt vorstellen: Die
let profile = { name : "Naphtali", age : 24, favCar : "Mustang", favDrink : "Baileys" }
Der obige Code erstellt nur ein Objekt namens " Profil" . Wir verwenden es für unsere beiden Beispiele . Seien Sie also nicht verwirrt, wenn Sie das Profilobjekt in einem Beispiel sehen. Sie müssen nur wissen, dass es erstellt wurde.
for ... of loop * kann entweder die Eigenschaft , den Wert oder beides zurückgeben. Schauen wir uns an, wie. In JavaScript können wir Objekte nicht wie in Arrays normal durchlaufen. Daher gibt es einige Elemente, mit denen wir von einem Objekt aus auf eine unserer Auswahlmöglichkeiten zugreifen können.
Object.keys ( Objektname-geht-hierher ) >>> Gibt die Schlüssel oder Eigenschaften eines Objekts zurück.
Object.values ( Objektname-geht-hierher ) >>> Gibt die Werte eines Objekts zurück.
Nachfolgend finden Sie Beispiele für ihre Verwendung. Achten Sie auf Object.entries () :
quelle
Die
for-in
Schleifefor-in
Mit loop werden aufzählbare Eigenschaften einer Sammlung in beliebiger Reihenfolge durchlaufen . Eine Sammlung ist ein Objekt vom Typ Container, dessen Elemente einen Index oder einen Schlüssel verwenden können.for-in
Die Schleife extrahiert die aufzählbaren Eigenschaften ( Schlüssel ) einer Sammlung auf einmal und durchläuft sie einzeln. Eine aufzählbare Eigenschaft ist die Eigenschaft einer Sammlung, die in einerfor-in
Schleife angezeigt werden kann.Standardmäßig werden alle Eigenschaften eines Arrays und eines Objekts in einer
for-in
Schleife angezeigt . Wir können jedoch die Object.defineProperty- Methode verwenden, um die Eigenschaften einer Sammlung manuell zu konfigurieren.Im obigen Beispiel werden die Eigenschaft
d
vonmyObject
und der Index3
vonmyArray
nicht in einerfor-in
Schleife angezeigt, da sie mit konfiguriert sindenumerable: false
.Es gibt nur wenige Probleme mit
for-in
Schleifen. Im Fall von Arraysfor-in
berücksichtigt die Schleife auch dasmethods
Hinzufügen des Arrays mithilfe dermyArray.someMethod = f
Syntax,myArray.length
bleibt jedoch bestehen4
.Die
for-of
SchleifeEs ist ein Missverständnis, dass
for-of
Schleifen die Werte einer Sammlung durchlaufen.for-of
Schleife iteriert über einIterable
Objekt. Eine iterable ist ein Objekt, auf dem die Methode mit dem NamenSymbol.iterator
direkt auf einem ihrer Prototypen steht.Symbol.iterator
Methode sollte einen Iterator zurückgeben . Ein Iterator ist ein Objekt mit einernext
Methode. Diese Methode wird als returnvalue
unddone
properties bezeichnet.Wenn wir ein iterierbares Objekt mit einer
for-of
Schleife iterieren , wird dieSymbol.iterator
Methode aufgerufen, sobald ein Iteratorobjekt abgerufen wird. Für jede Iteration derfor-of
Schleife wird dienext
Methode dieses Iteratorobjekts aufgerufen, bisdone
dernext()
Aufruf false zurückgibt. Der Wert, den diefor-of
Schleife für jede Iteration empfängt, wenn dievalue
Eigenschaft vomnext()
Aufruf zurückgegeben wird.Die
for-of
Schleife ist neu in ES6, ebenso wie Iterable und Iterables . DerArray
Konstruktortyp hat eineSymbol.iterator
Methode für seinen Prototyp. DerObject
Konstruktor hat es leider nichtObject.keys()
,Object.values()
undObject.entries()
Methoden geben eine iterable zurück ( Sie könnenconsole.dir(obj)
Prototypmethoden überprüfen ). Der Vorteil derfor-of
Schleife besteht darin, dass jedes Objekt iterierbar gemacht werden kann, auch Ihre benutzerdefinierten ObjekteDog
undAnimal
Klassen.Die einfache Möglichkeit, ein Objekt iterierbar zu machen, besteht darin, ES6 Generator anstelle einer benutzerdefinierten Iterator-Implementierung zu implementieren.
Im Gegensatz dazu
for-in
kannfor-of
loop in jeder Iteration warten, bis eine asynchrone Aufgabe abgeschlossen ist. Dies erreicht man mitawait
Schlüsselwort nachfor
Aussage Dokumentation .Eine weitere großartige Sache bei
for-of
Loop ist die Unicode-Unterstützung. Gemäß den ES6-Spezifikationen werden Zeichenfolgen mit UTF-16-Codierung gespeichert. Daher kann jedes Zeichen entweder16-bit
oder annehmen32-bit
. Traditionell wurden Zeichenfolgen mit UCS-2-Codierung gespeichert, die Zeichen unterstützt, die nur innerhalb gespeichert werden können16 bits
.Gibt daher
String.length
die Anzahl der16-bit
Blöcke in einer Zeichenfolge zurück. Moderne Zeichen wie ein Emoji-Zeichen benötigen 32 Bit. Daher würde dieses Zeichenlength
von 2 zurückkehren . Diefor-in
Schleife iteriert über16-bit
Blöcke und gibt das falsche zurückindex
. Diefor-of
Schleife durchläuft jedoch das einzelne Zeichen basierend auf den UTF-16-Spezifikationen.quelle
Ich fand die folgende Erklärung von https://javascript.info/array sehr hilfreich:
Eine der ältesten Methoden zum Wechseln von Array-Elementen ist die for-Schleife über Indizes:
Da Arrays Objekte sind, ist es technisch auch möglich, Folgendes zu verwenden:
Die Schleife für..in durchläuft alle Eigenschaften, nicht nur die numerischen.
Es gibt sogenannte "Array-ähnliche" Objekte im Browser und in anderen Umgebungen, die wie Arrays aussehen. Das heißt, sie haben Längen- und Indexeigenschaften, aber sie können auch andere nicht numerische Eigenschaften und Methoden haben, die wir normalerweise nicht benötigen. Die for..in-Schleife listet sie jedoch auf. Wenn wir also mit Array-ähnlichen Objekten arbeiten müssen, können diese „zusätzlichen“ Eigenschaften zu einem Problem werden.
Die for..in-Schleife ist für generische Objekte und nicht für Arrays optimiert und daher 10-100-mal langsamer. Natürlich ist es immer noch sehr schnell. Die Beschleunigung kann nur bei Engpässen von Bedeutung sein. Trotzdem sollten wir uns des Unterschieds bewusst sein.
Im Allgemeinen sollten wir for..in nicht für Arrays verwenden.
quelle
Hier ist eine nützliche Mnemonik, um sich an den Unterschied zwischen
for...in
Loop undfor...of
Loop zu erinnern ."Index in, Objekt von"
for...in Loop
=> iteriert über den Index im Array.for...of Loop
=> iteriert über das Objekt von Objekten.quelle