Je sais ce qu'est la for... in
boucle (itère sur la clé), mais entend la première fois for... of
(itère sur la valeur).
Je suis confondu avec la for... of
boucle. Je n'ai pas été adjecté. Voici le code ci-dessous:
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"
}
Ce que j'ai obtenu est, for... of
itère sur les valeurs des propriétés. Alors pourquoi il ne se connecte pas (retour) "3", "5", "7", "hello"
au lieu de "3", "5", "7"
? mais la for... in
boucle itère sur chaque touche ( "0", "1", "2", "foo"
). Ici, la for... in
boucle parcourt également la foo
clé. Mais for... of
n'itère pas sur la valeur de la foo
propriété ie "hello"
. Pourquoi c'est comme ça?
Longue histoire en bref:
Ici, je for... of
boucle la console . Il devrait se connecter, "3", "5", "7","hello"
mais ici, il se connecte "3", "5", "7"
. Pourquoi ?
la source
for ... of
été introduit dans le langage pour résoudre les problèmes d'utilisationfor ... in
des tableaux.Array.prototype
pourrait être modifié de telle sorte que des propriétés supplémentaires soient disponibles, ce qui rendrait leur itération dangereuse car vous pourriez obtenir des clés non numériques que vous ne vous attendiez pas.of
(pour… des boucles) , car il pose des questions sur un comportement spécifique de la fonctionnalité, plutôt que de demander un aperçu général.for <key> in
" et "for <value> of
" et réalisezfor..of
Réponses:
for in
boucle sur les noms de propriété énumérables d'un objet.for of
(nouveau dans ES6) utilise un itérateur spécifique à l'objet et boucle sur les valeurs générées par cela.Dans votre exemple, l' itérateur de tableau produit toutes les valeurs du tableau (en ignorant les propriétés non indexées).
la source
for ... of
est normalisé dans ES6.for... of
:: tableaux :: les tableaux ont toujours une longueur, vous pouvez donc penserfor..
[nième élément]of..
[q éléments]for..in..keys
=== clés étrangères === utiliserfor...in
pour les clés! En tant que tel, utilisezfor...of
pour les valeurs.Je trouve une réponse complète sur: https://www.typescriptlang.org/docs/handbook/iterators-and-generators.html (bien que ce soit pour le script de type, c'est la même chose pour javascript aussi)
la source
index
. Et puis pour "de" serait levalues
de chaque index / clé / élément.let thisItem = items[all];
variable,for...of
aide à raccourcir ça!for...in
commeObject.keys()
, devinez quoi? Les tableaux sont des objets, sot qui retourneraient également leurs indéces. :)Pour ... en boucle
La boucle for ... in améliore les faiblesses de la boucle for en éliminant la logique de comptage et la condition de sortie.
Exemple:
Mais, vous devez toujours faire face à la question de l'utilisation d'un index pour accéder aux valeurs du tableau, et cela pue; cela rend presque plus confus qu'auparavant.
De plus, la boucle for ... in peut vous causer de gros problèmes lorsque vous devez ajouter une méthode supplémentaire à un tableau (ou à un autre objet). Parce que pour ... dans les boucles boucle sur toutes les propriétés énumérables, cela signifie que si vous ajoutez des propriétés supplémentaires au prototype du tableau, ces propriétés apparaîtront également dans la boucle.
Tirages:
C'est pourquoi les boucles for ... in sont déconseillées lors du bouclage sur des tableaux.
Pour ... de boucle
Le pour ... de boucle est utilisée pour boucler sur tout type de données qui est itérable.
Exemple:
Tirages:
Cela fait de la boucle for ... of la version la plus concise de toutes les boucles for.
Mais attendez, il y a plus! La boucle for ... of présente également des avantages supplémentaires qui corrigent les faiblesses des boucles for et for ... in.
Vous pouvez à tout moment arrêter ou interrompre une boucle for ... of.
Tirages:
Et vous n'avez pas à vous soucier d'ajouter de nouvelles propriétés aux objets. La boucle for ... of boucle uniquement sur les valeurs de l'objet.
la source
for (var index=0; index<arr.length; index++)
boucle (où leindex
compteur est un entier, contrairement à votre exemple).Différence
for..in
etfor..of
:Les deux
for..in
etfor..of
sont des constructions en boucle qui sont utilisées pour parcourir les structures de données. La seule différence est sur ce qu'ils itèrent:for..in
parcourt toutes les clés de propriété énumérables d'un objetfor..of
itère sur les valeurs d'un objet itérable. Des exemples d'objets itérables sont les tableaux, les chaînes et les NodeLists.Exemple:
Dans cet exemple, nous pouvons observer que la
for..in
boucle itère sur les clés de l'objet, qui est un objet tableau dans cet exemple. Les clés sont 0, 1, 2 qui correspondent aux éléments du tableau que nous avons ajoutés etaddedProp
. Voici à quoiarr
ressemble l'objet tableau dans devtools chrome:Vous voyez que notre
for..in
boucle ne fait rien de plus qu'une simple itération sur ces valeurs.La
for..of
boucle de notre exemple itère sur les valeurs d'une structure de données. Les valeurs de cet exemple spécifique sont'el1', 'el2', 'el3'
. Les valeurs qu'une structure de données itérable renverra en utilisantfor..of
dépendent du type d'objet itérable. Par exemple, un tableau renvoie les valeurs de tous les éléments du tableau tandis qu'une chaîne renvoie chaque caractère individuel de la chaîne.la source
L'
for...in
instruction parcourt les propriétés énumérables d'un objet, dans un ordre arbitraire. Les propriétés énumérables sont les propriétés dont l'indicateur interne [[Enumerable]] est défini sur true. Par conséquent, s'il existe une propriété énumérable dans la chaîne de prototype, la propriétéfor...in
boucle itérera également sur celles-ci.L'
for...of
instruction parcourt les données que l'objet itératif définit pour être itérées.Exemple:
Comme précédemment, vous pouvez ignorer l'ajout
hasOwnProperty
defor...of
boucles.la source
L'instruction for-in parcourt les propriétés énumérables d'un objet, dans un ordre arbitraire.
La boucle va parcourir toutes les propriétés énumérables de l'objet lui-même et celles dont l'objet hérite du prototype de son constructeur
Vous pouvez le considérer comme "for in" itère et répertorie toutes les clés.
la source
for in
n'affichera les clés que si elles sont ajoutées par nos soins, cela ne montrera pas le format UnicornString.prototype
.Il existe certains types de données déjà définis qui nous permettent de les parcourir facilement, par exemple Array, Map, String Objects
Normal pour en itère sur l'itérateur et en réponse nous fournit les clés qui sont dans l'ordre d'insertion comme indiqué dans l'exemple ci-dessous.
Maintenant, si nous essayons la même chose avec pour de , alors en réponse, il nous fournit les valeurs et non les clés. par exemple
Donc, en regardant les deux itérateurs, nous pouvons facilement différencier la différence entre les deux.
Donc, si nous essayons d'itérer sur un objet normal, cela nous donnera par exemple une erreur-
Maintenant, pour itérer, nous devons définir un ES6 Symbol.iterator par exemple
Il s'agit de la différence entre For in et For of . J'espère que cela pourrait effacer la différence.
la source
Une autre différence entre les deux boucles, que personne n'a mentionnée auparavant:
La source
Donc, si nous voulons utiliser la déstructuration dans une boucle, pour obtenir à la fois l' index et la valeur de chaque élément du tableau , nous devons utiliser la
for...of
boucle avec la méthode Arrayentries()
:la source
for each...in
est obsolète (premier point), mais je n'ai pas écrit à ce sujet ... J'ai écrit que "La destructionfor...in
est obsolète. Utilisezfor...of
plutôt." (deuxième point): developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… Êtes-vous d'accord avec moi @GalMargalit?Tout le monde a expliqué pourquoi ce problème se produit, mais il est toujours très facile de l'oublier et de se gratter la tête pourquoi vous avez obtenu de mauvais résultats. Surtout lorsque vous travaillez sur de gros ensembles de données lorsque les résultats semblent bons à première vue.
En
Object.entries
vous assurant de parcourir toutes les propriétés:la source
A voir beaucoup de bonnes réponses, mais je décide de mettre mes 5 cents juste pour avoir un bon exemple:
Pour en boucle
itère sur tous les accessoires énumérables
Pour de boucle
itère sur toutes les valeurs itérables
la source
Quand j'ai commencé à apprendre la dans et de la boucle , je confondais avec ma sortie aussi, mais avec un couple de la recherche et la compréhension , vous pouvez penser à la boucle individuelle comme suit: La
let profile = { name : "Naphtali", age : 24, favCar : "Mustang", favDrink : "Baileys" }
Le code ci-dessus crée simplement un objet appelé profil , nous l'utiliserons pour nos deux exemples , donc, ne soyez pas confus lorsque vous voyez l' objet profil sur un exemple, sachez simplement qu'il a été créé.
for ... of loop * peut retourner la propriété , la valeur ou les deux , Voyons comment. En javaScript, nous ne pouvons pas parcourir les objets normalement comme nous le ferions sur des tableaux, donc, il y a quelques éléments que nous pouvons utiliser pour accéder à l'un de nos choix à partir d'un objet.
Object.keys ( nom-objet-va-ici ) >>> Renvoie les clés ou les propriétés d'un objet.
Object.values ( nom-objet-va-ici ) >>> Renvoie les valeurs d'un objet.
Voici des exemples de leur utilisation, faites attention à Object.entries () :
la source
La
for-in
bouclefor-in
La boucle est utilisée pour parcourir les propriétés énumérables d'une collection, dans un ordre arbitraire . Une collection est un objet de type conteneur dont les éléments peuvent utiliser un index ou une clé.for-in
loop extrait les propriétés énumérables ( clés ) d'une collection en une seule fois et l'itère une par une. Une propriété énumérable est la propriété d'une collection qui peut apparaître enfor-in
boucle.Par défaut, toutes les propriétés d'un tableau et d'un objet apparaissent en
for-in
boucle. Cependant, nous pouvons utiliser la méthode Object.defineProperty pour configurer manuellement les propriétés d'une collection.Dans l'exemple ci-dessus, la propriété
d
dumyObject
et l'index3
demyArray
n'apparaissent pas enfor-in
boucle car ils sont configurés avecenumerable: false
.Il y a peu de problèmes avec les
for-in
boucles. Dans le cas des tableaux, lafor-in
boucle prendra également en comptemethods
ajout sur le tableau en utilisant lamyArray.someMethod = f
syntaxe, cependant,myArray.length
reste4
.La
for-of
boucleC'est une idée fausse qui
for-of
boucle itérer sur les valeurs d'une collection.for-of
boucle itère sur unIterable
objet. Un itérable est un objet qui a la méthode avec le nomSymbol.iterator
directement dessus sur l'un de ses prototypes.Symbol.iterator
doit renvoyer un Iterator . Un itérateur est un objet qui a unnext
méthode. Cette méthode est appelée retourvalue
etdone
propriétés.Lorsque nous itérons un objet itérable en utilisant une
for-of
boucle,Symbol.iterator
la méthode sera appelée une fois get un objet itérateur . Pour chaque itération defor-of
boucle, lanext
méthode de cet objet itérateur sera appelée jusqu'à ce qu'elle soitdone
renvoyée par l'next()
appel renvoie false. La valeur reçue par lafor-of
boucle pour chaque itération si lavalue
propriété retournée par l'next()
appel.La
for-of
boucle est nouvelle dans ES6, tout comme les Iterable et Iterables . LeArray
type constructeur a uneSymbol.iterator
méthode sur son prototype. LeObject
constructeur ne l'a malheureusement pas maisObject.keys()
,Object.values()
et lesObject.entries()
méthodes renvoient un itérable ( vous pouvez utiliserconsole.dir(obj)
pour vérifier les méthodes du prototype ). L'avantage de lafor-of
boucle est que tout objet peut être itératives, même votre coutumeDog
etAnimal
classes.Le moyen le plus simple de rendre un objet itérable est d'implémenter ES6 Generator au lieu d'implémenter un itérateur personnalisé.
Contrairement à
for-in
, lafor-of
boucle peut attendre la fin d'une tâche asynchrone à chaque itération. Ceci est réalisé en utilisant la documentationawait
mot-clé aprèsfor
instruction .Une autre grande chose à propos de la
for-of
boucle est qu'elle prend en charge Unicode. Selon les spécifications ES6, les chaînes sont stockées avec le codage UTF-16. Par conséquent, chaque personnage peut prendre soit16-bit
ou32-bit
. Traditionnellement, les chaînes étaient stockées avec le codage UCS-2 qui prend en charge les caractères qui peuvent être stockés16 bits
uniquement.Par conséquent,
String.length
renvoie le nombre de16-bit
blocs dans une chaîne. Les caractères modernes comme un caractère Emoji prennent 32 bits. Par conséquent, ce caractère retourneraitlength
de 2.for-in
boucle itère sur les16-bit
blocs et renvoie le mauvaisindex
. Cependant, lafor-of
boucle parcourt le caractère individuel en fonction des spécifications UTF-16.la source
J'ai trouvé l'explication suivante sur https://javascript.info/array très utile:
L'une des plus anciennes façons de faire défiler les éléments du tableau est la boucle pour les index:
Techniquement, parce que les tableaux sont des objets, il est également possible d'utiliser for..in:
La boucle for..in parcourt toutes les propriétés, pas seulement les propriétés numériques.
Il existe des objets dits «de type tableau» dans le navigateur et dans d'autres environnements, qui ressemblent à des tableaux. Autrement dit, ils ont des propriétés de longueur et d'index, mais ils peuvent également avoir d'autres propriétés et méthodes non numériques, dont nous n'avons généralement pas besoin. La boucle for..in les listera cependant. Donc, si nous devons travailler avec des objets de type tableau, ces propriétés «supplémentaires» peuvent devenir un problème.
La boucle for..in est optimisée pour les objets génériques, pas les tableaux, et est donc 10 à 100 fois plus lente. Bien sûr, c'est toujours très rapide. L'accélération peut n'être importante que dans les goulots d'étranglement. Mais nous devons toujours être conscients de la différence.
En règle générale, nous ne devrions pas utiliser for..in pour les tableaux.
la source
Voici un mnémonique utile pour se souvenir de la différence entre
for...in
Loop etfor...of
Loop."index dans, objet de"
for...in Loop
=> itère sur l' index du tableau.for...of Loop
=> itère sur l' objet des objets.la source