for...in

Résumé

Cette instruction effectue, dans un ordre arbitraire, une boucle sur les propriétés énumérables d'un objet. Pour chacune des différentes propriétés, des instructions peuvent être exécutées.

Instruction
Implémenté sous : JavaScript 1.0
Version ECMA : ECMA-262

Syntaxe

for (variable in objet) {...
}

Paramètres

variable
Un nom de propriété différente est assigné à la variable à chaque itération de la boucle.
object
L'objet dont les propriétés énumérables sont parcourues par la boucle.

Description

Une boucle for...in ne parcourt pas les propriétés qui ne sont pas énumérables. Les objets qui ont été créés par des constructeurs intégrés comme Array et Object ont hérité de propriétés non énumérables de Object.prototype et String.prototype comme les méthodes indexOf de la classe String ou toString de la classe Object. La boucle parcourera toutes les propriétés énumérables de l'objet et aussi celles dont il hérite du prototype du constructeur (les propriétés les plus proches de l'objet dans la chaîne des prototypes primeront sur les propriétés des prototypes).

Une boucle for...in parcourt les propriétés d'un objet dans un ordre arbitraire (voir l'opérateur delete pour plus d'explications quant à l'impossibilité de se fier à un tel ordre, au moins dans le cas où on souhaite gérer plusieurs navigateurs). Si une propriété est modifiée dans une des itérations de la boucle et que la boucle itère ensuite sur cette propriété, sa valeur sera celle qui a été modifiée. Une propriété qui a été supprimée avant que la boucle n'itère sur celle-là ne sera pas dans la boucle. Les propriétés qui ont été ajoutées à l'objet pendant la boucle peuvent être ou ne pas être pris en compte. Une bonne pratique consiste à ne pas ajouter, modifier ou supprimer une propriété d'un objet lors d'une itération qui ne concerne pas cette propriété. Il n'y a aucune certitude concernant la prise en compte d'une propriété ajoutée lors d'une telle boucle et il en va de même pour savoir si on a visité une propriété avant ou après qu'elle ait été modifiée ou de savoir si une itération de la boucle concernera une propriété avant que celle-ci soit supprimée.

Pour ne prendre en compte que les propriétés de l'objet et pas celles des prototypes de l'objet, il est possible d'utiliser getOwnPropertyNames ou de tester hasOwnProperty  (propertyIsEnumerable peut également être utilisé). Si vous êtes sûr que votre code n'aura pas d'interaction avec un code externe, vous pouvez également étendre les prototypes intégrés avec une méthode de vérification.

for..in ne doit pas être utilisé pour parcourir un objet Array pour lequel l'ordre des indices est important. Les indices d'un tableau sont simplement des propriétés énumérables dont le nom est un entier. Comme pour les autres propriétés en général, il n'y a aucune garantie concernant l'ordre dans lequel les indices seront renvoyés. Par ailleurs, toutes les propriétés énumérables (pas seulement les indices) seront utilisées.

L'ordre des itérations dépend de l'implémentation qui a été faite et l'ordre peut donc varier. Il vaut donc mieux utiliser une boucle for avec un compteur (ou encore Array.forEach ou encore la boucle  for...of qui n'est pas standard) lorsqu'on souhaite effectuer une boucle sur un tableau où l'ordre des accès est important.

Exemples

La fonction qui suit utilise comme argument un objet et un nom d'objet. Elle parcourt ensuite toutes les propriétés énumérables et renvoie une chaîne de caractères décrivant le nom de la propriété et sa valeur.

var o = {a:1, b:2, c:3};

function show_props(obj, objName) {
  var result = "";
    
  for (var prop in obj) {
    result += objName + "." + prop + " = " + obj[prop] + "\n";
  }
    
  return result;
}

alert(show_props(o, "o")); /* affiche : o.a = 1 o.b = 2 o.c = 3 */ 

La fonction qui suit utilise hasOwnProperty pour ne pas afficher les propriétés héritées.

var triangle = {a:1, b:2, c:3};

function ColoredTriangle() {
  this.color = "red";
}

ColoredTriangle.prototype = triangle;

function show_own_props(obj, objName) {
  var result = "";
    
  for (var prop in obj) {
    if( obj.hasOwnProperty( prop ) ) {
      result += objName + "." + prop + " = " + obj[prop] + "\n";
    } 
  }
    
  return result;
}

o = new ColoredTriangle();
alert(show_own_props(o, "o")); /* affiche: o.color = red */ 

Voir aussi

Étiquettes et contributeurs liés au document

Contributeurs ayant participé à cette page : SphinxKnight
Dernière mise à jour par : SphinxKnight,