for. . . in vs for. . . of
for...of fournit les valeurs successives d’un objet itérable, tandis que for...in fournit les noms successifs des propriétés d’un objet sous forme de chaînes.
Comparaison point par point
#Ce qu’elle fournit à chaque tour
Fonctionne sur les tableaux
Fonctionne sur les objets ordinaires
Propriétés héritées du prototype
break, continue, await
Usage typique
Exemple
#const tasks = ['Leçon 1', 'Leçon 2', 'Leçon 3']
for (const index in tasks) {
console.log(typeof index, index)
}
for (const task of tasks) {
console.log(task)
}Définition et utilisation
#Les deux boucles fournissent quelque chose de différent à chaque tour. for...of fonctionne sur les objets itérables, comme les tableaux, les chaînes, Map et Set, et renvoie la valeur suivante. for...in fonctionne sur les objets ordinaires et renvoie le nom de propriété suivant (la clé) sous forme de chaîne, et vous lisez la valeur elle-même en plus via object[key].
Sur un tableau, for...in fonctionne aussi techniquement, mais il renvoie les indices sous forme de chaînes ("0", "1") et peut en plus capturer des propriétés énumérables supplémentaires, y compris héritées du prototype. for...of n’a pas ce problème, car il itère sur les valeurs elles-mêmes, et il prend en plus en charge break, continue et await à l’intérieur, ce que for...in ne prend pas totalement en charge.
La règle est simple : pour les tableaux, les chaînes et les autres objets itérables, utilisez for...of. Réservez for...in aux situations rares avec des objets dont vous ne connaissez pas la forme à l’avance, et même là, Object.keys() ou Object.entries() combinés avec for...of sont souvent plus pratiques.
Syntaxe
#for (const value of iterable) {
// instructions
}
for (const key in object) {
// instructions
}Plus d’exemples
#const points = [10, 20, 30]
for (const index in points) {
console.log(index + 1)
}
for (const [index] of points.entries()) {
console.log(index + 1)
}Dans for...in, l’indice est une chaîne, donc + 1 concatène du texte. for...of avec entries() donne un indice numérique, donc l’addition fonctionne normalement.
const student = { name: 'Lucas', level: 4 }
for (const key in student) {
console.log(key, student[key])
}
for (const [key, value] of Object.entries(student)) {
console.log(key, value)
}Pour un objet simple sans propriétés héritées, les deux boucles donnent le même résultat. Object.entries() ne renvoie toutefois que les clés propres, ce qui est plus sûr.
Bonnes pratiques
#- Pour les tableaux, choisissez toujours
for...of(ouforEach(),map()).for...insur un tableau est une cause fréquente de bugs difficiles à trouver. - Vous avez besoin des clés d’un objet dans une boucle
for...of? UtilisezObject.keys()ouObject.entries(), vous n’avez alors pas besoin de vérifierObject.hasOwn(). - Avec
awaitdans une boucle sur un tableau d’opérations asynchrones, seulfor...offonctionne.
Entrées associées
#- for...ofParcourt les valeurs successives d’un objet itérable : tableau, chaîne, Map, Set et autres.
- for...inParcourt les noms des propriétés énumérables d’un objet, y compris celles héritées du prototype.
- Object.entries()Renvoie un tableau des paires [clé, valeur] d’un objet.
- Object.keys()Renvoie un tableau des noms des propriétés propres et énumérables d’un objet.
- Array.prototype.forEach()Appelle une fonction pour chaque élément du tableau.
Vous voyez une erreur ou il manque un exemple ? Écrivez-nous.